Node.js模块加载机制

152 阅读3分钟

导入和导出

require的返回值是A模块中的exports对象

exports导出

// a.js
 let version = 1.0;// 定义变量
 const add = (n1,n2) => n1 + n2;// 定义方法
 exports.version = version;
 exports.add = add; //第一个add是exports对象的属性,第二个add是a模块的方法
// b.js
 const a = require('./a.js');// a是个对象,后缀可省:require('./a')
 console.log(a.version);// 输出b模块中的version变量
 console.log(a.add(10,20));//调用b模块的方法

module.exports导出

// c.js
const greeting = name => `hello ${name}`;
const x = 100;
exports.x = x;
module.exports.greeting = greeting;
// 若没有下面的代码,exports和module.exports是等价的,都指的是本文件对象,而不是具体的greeting方法或者变量x

//当exports对象和module.exports对象指向的不是同一个对象时:被另一个文件导入后的对象以module.exports为准
module.exports = {
	name: 'zhangsan'
}
//没有生效
exports = {
	age: 20
}
// d.js
const a = require('./c.js');//a是对象,里面包含变量和方法
console.log(a);// 打印{ name: 'zhangsan' }

两种导出方式的联系与区别:

1.jpg

package.json文件

package.json:项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等

在项目的根目录下,使用npm init -y命令生成,里面的选项都是默认值

项目依赖、开发依赖

  • 项目依赖:
    • 在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖
    • 用( npm install 第三方模块名 )下载后,会记录到dependencies中
  • 开发依赖:
    • 在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
    • 用( npm install 第三方模块名 --save-dev )将包添加到devDependencies字段中 区分意义:在不同的运行环境下,下载不同的依赖:
  • 只有package.json文件,没有node_modules文件夹:
    • 线下的开发环境,下载全部依赖(项目依赖和开发依赖): npm install
    • 线上的运营环境(服务器环境),只下载dependencies里的依赖: npm install --production
  • 下载完后,目录里就会出现node_modules文件夹,包含着下载好的依赖(第三方模块包)
{
  "name": "description",  //项目名称
  "version": "1.0.0",  //项目版本
  "description": "",  //项目描述
  "main": "index.js",  //项目的主模块文件
  "scripts": {  //命令的别名:要执行的命令过长,用别名替代输入
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "nodemon app.js"
  },
  "keywords": [],  //用关键字描述当前项目
  "author": "",  //项目作者
  "license": "ISC",  //项目遵循的协议:默认是ISC(开放源代码的协议)
  "dependencies": { //记录当前项目依赖的第三方模块
    "formidable": "^1.2.1",
    "mime": "^2.3.1"
  },
  "devDependencies": {
    "gulp": "^3.9.1"
  }
}

package.json中scripts的使用:npm run 别名

  • 例:npm run build

package-lock.json文件

作用:详细的记录了模块间的依赖关系

  • 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
  • 能加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载,不需要做额外的工作(因为下一次下载时,npm就不再需要分析模块间的依赖关系,直接查找下载地址并下载即可)

模块加载机制

  • require('./find.js'); //完整路径,直接引入模块
  • 模块有路径无后缀: require('./find');

2.jpg

  • 模块无路径无后缀:require('find');

3.jpg