NodeJS——模块化commonjs

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TDCQZD/article/details/82178796

一、模块化

1、基本介绍
每个文件是一个模块,有自己的作用域。
在模块内部 module变量代表模块本身。
module.exports属性代表模块对外的接口。
2、 module
对当前模块的引用,其exports属性用于指定一个模块所导出的内容,即可以通过 require() 访问的内容。
3、 exports
这是一个对于 module.exports 的更简短的引用形式。
4、require()
require用于加载一个模块(用户自定义模块、第三方模块、系统模块)
前两者是在运行时动态加载的,需要通过路径分析,文件定位,编译等,因此加载速度慢于核心模块。(速度:系统模块>用户自定义模块>第三方模块)
注意事项:
module被加载的时候执行,加载后缓存(browserify也一样)。
避免模块间的相互依赖!(A依赖于B B依赖于A)

二、Node模块

1、模块标识符
require方法接受一个标识符作为参数。在Node的实现中正是基于这样的一个标识符进行模块的查找。标识符在模块中主要分为以下几类:

    1.  系统模块
    2.  ./ 或 ../开始的相对路径文件模块
    3.  /开始的绝对路径文件模块
    4.  非路径形式的文件模块。

2、 模块路径
模块路径是node在定位文件模块的具体文件时制定的查找策略。具体表现为一个路径组成的数组。
Module.paths: 返回一个数组,require加载模块便是基于该数组进行查找,这个数组是从当前文件下的node_modules,一层一层往上到所在盘下的node_modules.
3、 文件定位
require(模块标识符),标识符可以不包含扩展名,Node会按照以下顺序
.js | .json | .node 的顺序进行补足扩展名.
在进行补足扩展名时候,如果发现并没有这个文件,我们得到的是一个文件夹(目录),Node会把目录当做包来处理.

Node对包进行以下处理:

  • 1) 在当前目录下查找package.json文件.通过JSON.parse()解析出包描述对象,通过其中的main属性的文件名进行再次定位查找,如果该文件名没有扩展名,再次按照之前的文件扩展名补足方式进行补足.

  • 2)main属性指定的文件名错误,或者当前目录不存在package.json文件,Node会把index当做默认文件名,依次查找
    index.js | index.json | index.node.
    如果在目录分析的过程中没有成功定位到任何文件或目录,则按照module.paths,遍历该路径数组,如果都不存在就报错.

4、 总结
分析模块标识符能否定位到一个确切的文件或目录
如果可以:

  • 文件:直接定位文件

  • 目录:包的规则

如果不可以

  • 使用module.paths

三、快速入门案例

1、自定义模块user.js

console.log("user")
module.exports = function () {
    console.log("用户自定义模块")
}

2、引入用户自定义模块

const snw = require("./snw/snw.js");
snw();

注意路径问题:../返回上一级目录

3、引入系统模块

const fs = require("fs")
// console.log(fs)
const path = require("path")
// console.log(path)
const event = require("events")
console.log(event)

4、第三方模块
说明:引入的第三方模块是chalk。

引入指令:

npm init -y
npm install chalk --save-dev 

console.log(module.paths)
const chalk = require("chalk")
console.log(chalk.blue('Hello world!'));
console.log(chalk.blue.bgRed.bold('Hello world!'));

5、缓存
说明:js引入多个相同模块时,只会执行一次引入模块。

 require("./custom/user")
 require("./custom/user")
 require("./custom/user")
 require("./custom/user")
 require("./custom/user")
 console.log(module.paths)

测试结果:

"D:\DevFiles\WebStorm 2018.1.4\bin\runnerw.exe" D:\DevFiles\nodejs\node.exe E:\atguiguCode\WebProject\web_code\work\Node\02_commonjs\04_缓存.js
user
[ 'E:\\atguiguCode\\WebProject\\web_code\\work\\Node\\02_commonjs\\node_modules',
  'E:\\atguiguCode\\WebProject\\web_code\\work\\Node\\node_modules',
  'E:\\atguiguCode\\WebProject\\web_code\\work\\node_modules',
  'E:\\atguiguCode\\WebProject\\web_code\\node_modules',
  'E:\\atguiguCode\\WebProject\\node_modules',
  'E:\\atguiguCode\\node_modules',
  'E:\\node_modules' ]

Process finished with exit code 0

四、路径问题说明

1、相对路径&绝对路径
相对路径都是参照于当前模块文件的 与 node的执行目录没有关系
绝对路径参照于 node的根目录
2、node路径
process.cwd():node的执行目录
在node中除了require以外其他api中涉及到相对路径都是参照于 process.cwd()

猜你喜欢

转载自blog.csdn.net/TDCQZD/article/details/82178796