// 加载内置模块
const fs = require('fs')
// 加载用户的自定义模块
const custom = require('./custom.js')
// 加载第三方模块
const moment = require('moment')
module
对象,存储了和当前模块有关的信息module.exports
对象,将模块内的成员共享出去,供外界使用。导入自定义模块时,得到的就是 module.exports
指向的对象。exports
和 module.exports
指向同一个对象。最终共享的结果,以 module.exports
指向的对象为准。(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 指向的对象. 建议只用一种方式,以防混淆
module
变量代表当前模块module
变量是一个对象,module.exports
是对外的接口module.exports
属性模块第一次加载后会被缓存,即多次调用 require()
不会导致模块的代码被执行多次,提高模块加载效率。
内置模块加载优先级最高。
加载自定义模块时,路径要以 ./
或 ../
开头,否则会作为内置模块或第三方模块加载。
导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:
.js
扩展名加载.json
扩展名加载.node
扩展名加载/node_modules
文件夹中加载第三方模块。例如,假设在 C:\\Users\\bruce\\project\\foo.js
文件里调用了 require('tools')
,则 Node.js 会按以下顺序查找:
C:\\Users\\bruce\\project\\node_modules\\tools
C:\\Users\\bruce\\node_modules\\tools
C:\\Users\\node_modules\\tools
C:\\node_modules\\tools
初次装包完成后,在项目文件夹下多一个叫做 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
当把目录作为模块标识符进行加载的时候,有三种加载方式:
package.json
的文件,并寻找 main
属性,作为 require()
加载的入口package.json
文件,或者 main
入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js
文件。