模块化概念

Node.js 中模块的分类

// 加载内置模块
const fs = require('fs')
// 加载用户的自定义模块
const custom = require('./custom.js')
// 加载第三方模块
const moment = require('moment')

Node.js 中的模块作用域

模块作用域的成员

(1)module 对象 每个 .js 自定义模块中都有一个 module 对象,导入模块时,其实是导入module.exports指向的对象。默认值为 {}

(2)module.exports 在 module.exports 对象上挂载属性方法

// test.js
[module.exports.name](<http://module.exports.name/>) = 'zs'
	module.exports.sayHello = function(){
	console.log('Hello World ')
}

// 指向了新对象会覆盖上面的挂载参数
module.exports = {
	nikname = 'ls',
	sayHi() {
		console.log('say hi')
	}
}
// index.js
const custom = require('./test')
console.log(custom)				// {name:zs,sayHello:[Function]}

(3)exports 简化 module.exports。默认情况下 exports 和 module.exports 指向同一个对象。最终结果以 module.exports 指向的对象为准

// test.js
[exports.name](<http://exports.name/>) = 'zs'
	exports.sayHello = function(){
	console.log('Hello World ')
}
// index.js
const custom = require('./test')
console.log(custom)				// {name:zs,sayHello:[Function]}

(4)同时使用注意事项 使用 require() 模块时,得到的永远是 module.exports 指向的对象. 建议只用一种方式,以防混淆

Untitled

CommonJS 模块化规范

模块加载机制

模块第一次加载后会被缓存,即多次调用 require() 不会导致模块的代码被执行多次,提高模块加载效率。

内置模块加载

内置模块加载优先级最高。

自定义模块加载

加载自定义模块时,路径要以 ./../ 开头,否则会作为内置模块或第三方模块加载。

导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:

第三方模块加载

例如,假设在 C:\\Users\\bruce\\project\\foo.js 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:

初次装包完成后,在项目文件夹下多一个叫做 node modules 的文件夹和 package-lock.json 的配置文件。不要手动修改里面的东西,npm包管理工具会自动维护。

node modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。

package-lock.json 配置文件用来记录 node modules 目录下的晦一个包的下载信息,例如包的名字、版本号、下载地址等。

7.dependencies 作用:在 package.json 中记录核心依赖包信息

正常安装默认为核心依赖包

8.devDependencies 作用:在 package.json 中记录开发依赖包信息

如果某些包只在项目开发阶段用到,在项目上线以后不会用到,建议把这些包记录在 devDependencies 中。相反,如果在开发及上线都用到,则记录在 dependencies 中。一般来说依据官方使用说明安装即可

# 安装到 devDependencies 
npm i 包名称 -D
npm install 包名称 --save-dev

包的分类

那些被安装到项目中的 node_modules 目录中的包都是项目包,项目包又分为两类:

npm i 包名 -D # 开发依赖包
npm i 包名    # 核心依赖包

全局包:在执行npm install 命令时提供了 -g 参数,则会把包安装位区全局包。

npm i 包名 -g   # 全局安装指定的包
npm uninstall 包名 -g    # 卸载全局包

共享代码

由于第三方包(node_modules)体积过大,不方便分享代码,所以共享时应剔除 node_modules

项目根目录下创建 package.json ,记录安装了哪些包。使用 git 时应把 node_modules 添加到 .gitignore 中。

# 编写代码前先创建 package.json 项目目录不能有中文和空格
# 安装包时,会自动记录包信息到 package.json
npm init -y

# 一次性安装所有的包	
npm install
npm i

目录作为模块加载

当把目录作为模块标识符进行加载的时候,有三种加载方式: