node笔记二之模块化细节

81 阅读3分钟
  1. require
1. 绝对路径  其他写法(相对路径)最后都会转化为绝对路径
require("/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/a.js"); // module a.js

2.相对路径
require("./a");//默认找js后缀的a文件

3.从node_modules导包
require("abc");

4.没有后缀文件的查找顺序
js、json 、node 、 mjs 按照这个顺序依次找
const res = require("./a");

5.如果仅提供目录,不提供文件名,则自动寻找该目录中的index.js
require("./test")
查找顺序 ./test  ./test.js  ./test.json  ./test.node  ./test.mjs  ./test/index.js

6. package.json 中的main字段
    6.1 表示包的默认入口
    6.2 导入或执行包时若只提供目录,则使用main补全入口
    6.3 默认值为index.js
    
    在node_modules中新建abc文件,其他地方引用的规则如下
    执行 node ./ ,会找到package.json 的 main字段对应的文件执行
    require("abc"); //执行main声明的文件
    require("abc/index"); //直接执行abc/index.js[自动补文件名]
  1. module对象
  Module {
  id: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src/index.js', // 模块的绝对路径,入口模块的绝对路径是个. 
  path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src', // 这个模块的目录
  exports: {}, //导出对象
  parent: Module { // 那个模块在用它
    id: '.',
    path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002',
    exports: {},
    parent: null,
    filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js',
    loaded: false, //是否加载完了
    children: [ [Circular *1] ],
    paths: [ //从什么位置找包
      '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/node_modules',
      '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/node_modules',
      '/Users/fuxing/Desktop/project/code/web/node/node_modules',
      '/Users/fuxing/Desktop/project/code/web/node_modules',
      '/Users/fuxing/Desktop/project/code/node_modules',
      '/Users/fuxing/Desktop/project/node_modules',
      '/Users/fuxing/Desktop/node_modules',
      '/Users/fuxing/node_modules',
      '/Users/node_modules',
      '/node_modules'
    ]
  },
  filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src/index.js',
  loaded: false, //是否运行完
  children: [],//子模块
  paths: [
    '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src/node_modules',
    '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/node_modules',
    '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/node_modules',
    '/Users/fuxing/Desktop/project/code/web/node/node_modules',
    '/Users/fuxing/Desktop/project/code/web/node_modules',
    '/Users/fuxing/Desktop/project/code/node_modules',
    '/Users/fuxing/Desktop/project/node_modules',
    '/Users/fuxing/Desktop/node_modules',
    '/Users/fuxing/node_modules',
    '/Users/node_modules',
    '/node_modules'
  ]
}
  1. require函数
[Function: require] {
  resolve: [Function: resolve] { paths: [Function: paths] }, // 转换为绝对路径
  main: Module {// 主模块
    id: '.',
    path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002',
    exports: {},
    parent: null,
    filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js',
    loaded: false,
    children: [],
    paths: [
      '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/node_modules',
      '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/node_modules',
      '/Users/fuxing/Desktop/project/code/web/node/node_modules',
      '/Users/fuxing/Desktop/project/code/web/node_modules',
      '/Users/fuxing/Desktop/project/code/node_modules',
      '/Users/fuxing/Desktop/project/node_modules',
      '/Users/fuxing/Desktop/node_modules',
      '/Users/fuxing/node_modules',
      '/Users/node_modules',
      '/node_modules'
    ]
  },
  extensions: [Object: null prototype] {//扩展名,不同的后缀文件根据不同的方法执行
    '.js': [Function (anonymous)],//不同的后缀文件根据不同的方法执行
    '.json': [Function (anonymous)],
    '.node': [Function (anonymous)]
  },
  cache: [Object: null prototype] { // 缓存的模块 
    '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js': Module {//绝对路径作为id
      id: '.',
      path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002',
      exports: {},
      parent: null,
      filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js',
      loaded: false,
      children: [],
      paths: [Array]
    }
  }

4.当执行一个模块或使用require时,会将模块放置在一个函数环境中;ps:__dirname, __filename的来源,以及this、 exports 、module.exports的关系

ps:thisexportsmodule.exports 开始是相等的】
================ a.js ================
console.log("当前模块路径:", __dirname);
console.log("当前模块文件:", __filename);
this.m = 5;
exports.c = 3;
console.log(this === exports, exports === module.exports); //true  true
module.exports = {
  a: 1,
  b: 2,
};
console.log(this === exports, exports === module.exports); //true  false

================ index.js ================
require("./a.js");

==========================================
分析a文件log的结果,以及 __dirname ,__filename 的来源【它们不是node的内置变量】
==>> 当执行一个模块或使用require时,会将模块放置在一个函数环境中
==>>require("./a.js")的伪代码如下,__dirname, __filename 实际上是这层函数传的参数
function _temp(module, exports, __dirname, __filename) {
    console.log("当前模块路径:", __dirname);
    console.log("当前模块文件:", __filename);
    this.m = 5;
    exports.c = 3;
    console.log(this === exports, exports === module.exports); //true  true
    module.exports = {
      a: 1,
      b: 2,
    };
    console.log(this === exports, exports === module.exports); //true  false
}