NodeJS模块的导入导出,包文件

文章目录

    • 1 导入模块
      • 1.1 加载模块作用
      • 1.2加载规则
        • 1.2.1 从缓存中加载
        • 1.2.2 判断模块标识
    • 2 导出模块
      • 2.1 导出多个成员(必须在对象中)
      • 2.2 导出单个成员(函数,字符串)
      • 2.3 exports 和 module.exports 的区别
        • 2.3.1 相同点
        • 2.3.2 不同点
        • 2.3.3 总结
    • 3 包说明文件
      • 3.1 package.json文件
      • 3.2 package-lock.json文件

1 导入模块

var  自定义变量名 = require('模块');

1.1 加载模块作用

  • 核心模块,三方模块,自定义模块
  • 执行被加载模块中的代码
  • 得到被加载模块中的exports 导出接口对象

1.2加载规则

  • 优先从缓存中加载
  • 核心模块
  • 路径形式的文件模块
  • 第三方模块

1.2.1 从缓存中加载

例如:main.js,优先从缓存加载,由于 在 a 中已经加载过 b 了,所以 这里不会重复加载,可以拿到其中的接口对象,但是不会重复执行里面的代码, 这样做的目的是为了避免重复加载,提高模块加载效率

require('./a.js');
var fn = require('./b');
console.log(fn);

a.js

console.log("a.js被加载");
var fn = require('./b');
console.log(fn);

b.js

console.log("b.js被加载");
module.exports=function(){
console.log(fn);
}

1.2.2 判断模块标识

require('模块标识');
  1. 路径形式的模块
  • ./, …/,/xxx
  • 带盘符的绝对路径
  1. 核心模块
  • 核心模块的本质也是文件
  • 但是文件被编译到二进制文件中了,可直接使用
  1. 第三方模块
  • 凡是第三方模块都必须通过 npm 的方式来下载
  • 使用的时候就可以通过 require('包名') 的方式来进行加载才可以 使用
  • 既不是核心模块,也不算路径形式模块
    以模板引擎模块art-template为例
先找到当前文件所处目录中的node_modules目录
然后node_modules/art-template
最后找到node_modules/art-template/package.json文件中的main属性
然后main属性,记录了art-template的入口模块
如果package.json文件不存在或者没有main属性,那么就加载默认备选项 index.js

2 导出模块

  • node中是模块作用域,默认文件中所有的成员只在当前文件模块有效
  • 对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到exports接口对象中就可以导出多个成员

2.1 导出多个成员(必须在对象中)

exports.a = 123;
exports.b ='hello';
exports.c=function(){
	console.log('ccc');
}

2.2 导出单个成员(函数,字符串)

module.exports='hello';

以下情况会覆盖

module.exports='hello';
//下面的会覆盖之前的hello
module.exports=function(x,y){
	return x+y;
}

2.3 exports 和 module.exports 的区别

2.3.1 相同点

  • 在node中,每个模块中都有一个 module 对象
  • module 对象中有一个 exports 对象(默认是空对象)
  • 我们可以把需要导出的成员都挂载到 module.exports 接口对象中,也就是:moudle.exports.xxx = xxx 的方式
  • 但是每次都 moudle.exports.xxx = xxx 很麻烦
  • 所以 Node 为了方便,同时在每一个模块中都提供了一个成员叫:exports
  • exports === module.exports 结果为 true
  • 所以对于:moudle.exports.xxx = xxx 的方式 完全可以:expots.xxx = xxx

2.3.2 不同点

  • 当一个模块需要导出单个成员的时候,这个时候必须使用:module.exports = xxx 的方式
  • 不要使用 exports = xxx因为这样不管用
  • 因为 每个模块最终向外return的是module.exports
  • exports 只是 module.exports 的一个引用
  • 所以即便为 exports = xx 重新赋值,也不会影响 module.exports
  • 但是有一种赋值方式比较特殊:exports = module.exports 这个用来重新建立引用关系的,而和之前的 exports 就没有关系了

2.3.3 总结

exports只是一个module.exports的引用 ,尽量不要破坏他们之间的引用关系就好了

3 包说明文件

3.1 package.json文件

package.json文件记录项目中所需要的所有模块。 当执行npm install的时候,node会先从package.json文件中读取所有dependencies信息,然后根据dependencies中的信息与node_modules中的模块进行对比, 没有的直接下载,已有的检查更新
另外,package.json文件只记录通过npm install方式安装的模块信息,而这些模块所依赖的其他子模块的信息不会记录。
npm init 命令生成包描述文件,在dos窗口里面 必须切换到要安装的目录,就会安装在那里 傻瓜式一路next,如下图:
NodeJS模块的导入导出,包文件_第1张图片
包说明文件

{
  "name": "feed_back",
  "version": "1.0.0",
  "description": "留言板项目",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "jingzh",
  "license": "ISC",
  "dependencies": {
    "jquery": "^3.4.1"
  }
}

3.2 package-lock.json文件

  • 这个是在 npm 5 以前是不会有 package-lock.json ,在5之后才加入了这个文件
  • package-lock.json是当 安装包,node_modules 或 package.json 发生变化时自动生成的文件。
  • npm5之后的版本不需要添加— — save ,它就会自动保存这个依赖信息
  • 这个文件主要功能是确定当前安装的包的依赖,以便后续重新安装的时候 生成相同的依赖 ,而忽略项目开发过程中有些依赖已经发生的更新。
  • package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖子模块。 当执行npm install的时候,node从package.json文件读取模块名称,从package-lock.json文件中获取版本号 ,然后进行下载或者更新

你可能感兴趣的:(NodeJS)