安装nodejs
官网地址:https://nodejs.org/zh-cn/
浏览器
浏览器运行的是html页面,并加载页面中通过script元素引入的js
nodejs
nodejs直接运行某个js文件,该文件被称之为入口文件
nodejs遵循EcmaScript标准,但由于脱离了浏览器环境,因此:
- 你可以在nodejs中使用EcmaScript标准的任何语法或api,例如:循环、判断、数组、对象等
- 你不能在nodejs中使用浏览器的 web api,例如:dom对象、window对象、document对象等
由于大部分开发者是从浏览器端开发转向nodejs开发的,为了降低开发者的学习成本,nodejs中提供了一些和浏览器web api同样的对象或函数,例如:console、setTimeout、setInterval等
CommonJS
node.js对模块化的需求比浏览器端的更大
node.js是将commonJS作为模块化规范
一个模块就是js文件 实现一部分功能
模块两个核心要素:隐藏和暴露
隐藏是直接自身内部实现的,
暴露是对外使用的接口
任何的正常的模块化的标准,默认隐藏模块所有的实现,通过语法和api调用来暴露接口
模块导出,需要使用的该模块暴露的部分,隐藏的部分是永远无法使用的
当通过某种语法和api去使用模块时,这个过程叫做模块导入
CommonJS 规范
commonJS使用exports导出模块,require导入模块
1.如果一个js文件中存在exports或者repuire,则这个js文件是个模块
Node.js 对 CommonJS的实现
首先找到模块路径,若能找到就会执行模块内文件
然后会把导出函数当做函数的返回
node.js是导入模块,是使用相对路径,必须以./ 或者../开头
1.保证高效的执行,仅仅是加载必要模块。nodejs只有执行到require的函数才睡加载并执模块
2.隐藏函数执行,以保证不污染全局的变量
```
(()=>{
//代码块
})
```
3.为保证模块顺利导出内容,nodejs做了处理
在模块开始执行前,初始化一个 module.exports ={}
module.exports即是模块的导出值
为了方便导出nodejs初始化完module.exports后,就会新声明一个变量exports = module.exports
导入模块常用写法
重新赋值
module.exports="
//模块
"
不能重新赋值
exports = 模块
4.为了避免反复加载同一个模块,nodejs默认开球模块缓存,如果加载的模块以及被加载过了,则会自动使用之前导出的结果
提高执行效率
#练习commonjs 模块化开发
- 工具模块,导出一个函数,用于将一个数组中的所有内容乱序排列
- 扑克牌构造函数(类)
- 属性
- 花色(1~4,♣、♥、♦、♠)
- 牌面(1~15,14小王,15大王)
- 方法
- toString:得到该扑克牌的字符串
- 属性
- 入口模块(入口文件)
- 创建54张扑克牌
- 洗牌
- 发牌
//index。js 入口文件
var pokers = [];//扑克牌的数组
var Poker = require("./poker")//导入扑克牌的构造函数
for (let i = 1; i < 13; i++) {//循环牌面
for (let j = 1; j < 4; j++) {//循环花色
pokers.push(new Poker(j,i));
}
}
pokers.push(new Poker(null,14),new Poker(null,15))
for (let i = 0; i < pokers.length; i++) {
const p =pokers[i];
console.log(p.toString());
}
// 顺序打乱
let uitl = require("./util");
uitl.sortRandom(pokers);
for (const p of pokers) {
console.log(p.toString());
}
var Play1 = pokers.slice(0,18);
var Play2 = pokers.slice(17,34);
var Play3 = pokers.slice(34,51);
var desk= pokers.slice(51)
console.log("玩家1:");
uitl.print(Play1);
console.log("玩家2:");
uitl.print(Play2);
console.log("玩家3:");
uitl.print(Play3);
console.log("桌面:");
uitl.print(desk);
util。js
module.exports = {
/**
* @description: 讲数组内容打乱
* @param {type} arr
* @return {type}
* @author: Ricardo
*/
sortRandom: (arr) => {
arr.sort((a, b) => {
return Math.random() - 0.5;
})
},
/**
* @description: 打印扑克牌的数组
* @param {type} pokers
* @return {type}
* @author: Ricardo
*/
print: (pokers) => {
var str = "";
for (let i = 0; i < pokers.length; i++) {
const p = pokers[i];
str += p.toString() + " ";
}
console.log(str);
}
}
pokers。js
function Poker(color,number) {
this.color= color;
this.number = number;
}
Poker.prototype.toString =function(){
var str = "";
//1. 花色(1~4,♣、♥、♦、♠)
//2. 牌面(1~15,14小王,15大王)
if (this.color === 1) {
str ="♣";
} else if(this.color ===2) {
str="♥";
}else if(this.color ===3) {
str="♦";
}else if(this.color ===4) {
str="♥";
}
// 牌面
if (this.number>=2 && this.number<=10) {
str += this.number;
}
else if (this.number ===1 ) {
str+="A";
} else if (this.number ===11 ) {
str+="J";
} else if (this.number ===12 ) {
str+="Q";
} else if (this.number ===13 ) {
str+="K";
} else if (this.number ===14 ) {
str="joker";
} else if (this.number ===15 ) {
str="JOKER ";
}
return str;
}
module.exports =Poker;