Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

module #55

Open
Genluo opened this issue Sep 6, 2019 · 0 comments
Open

module #55

Genluo opened this issue Sep 6, 2019 · 0 comments
Labels
Node Node相关

Comments

@Genluo
Copy link
Owner

Genluo commented Sep 6, 2019

在node的模块系统中,每个文件都被视为一个独立的模块

文档部分

  • __dirname
  • __filename
  • exports
  • module
  • require()
  • require对象
    • require.cache:被引入的模块将被缓存在这个对象上,包含整个这个文件中的引用,主要node中针对模块的缓存
    • require.extensions
    • require.main:获取到模块的对象
    • require.resolve(request[, options]):使用reuqire()机制查询模块的位置,但是此操作只返回解析后的文件名,不会加载该模块
    • require.resolve.paths(request):被查询解析路劲的模块的路径
  • module对象
    • module.children:被该模块引用的模块对象
    • module.exports
    • module.filename:模块完全解析后的文件名
    • module.id:模块的标识符
    • module.loaded: 模块是否已经完成加载,或者正在加载中
    • module.parent:这个返回最引用该模块的模块,和上述进行对比说明
    • module.paths:模块的搜索路径
    • module.require(id):提供一种类似require()从原始模块被调用的加载模块的方式
  • module模块
    • module.builtinModules:罗列Nodejs提供的所有模块的名称,可以用来判断模块是否为第三方所维护
    • module.createReqireFormPath(filename):用于构造通过相对路径加载模块的函数的文件名

理解部分

  • 使用require.main === module来判断模块是不是文件是不是直接被运行

  • 通过检查require.main.filename来获取当前应用程序的入口点

  • 获取require()是加载的确切的文件,使用require.resolve() 函数

1、module 和require.main 之间的关联

module:首先module的自由变量是表示当前模块的对象的引用。

require.main:这个模块对象是由引用这个模块的模块创建的,如果直接使用node执行这个模块,那个直接require.main === module是相等

module是模块内部对象的指向,require.main 是由外部引用模块的module对象,那么针对外部引用的方式,那么我们可以得知下面这个等式成立:

util.isDeepStrictEqual(module.parent, require.main)

module函数的举例:

// index.ts
import mod from 'module';

console.log(module.filename);
console.log(require.main.filename)
console.log(util.isDeepStrictEqual(module.parent, require.main));
// global
import './index';

console.log(require.main === module)
// 执行 node global

/Users/ligen/code/github/nodeStudy/build/index.js
/Users/ligen/code/github/nodeStudy/build/gobal.js
true // 外部调用
true  // 内部调用

缓存的影响:模块在第一次加载后会被缓存,多次调用require会导致整个模块返回完全相同的对象,如果和模块缓存结合起来,那么我们可以判断模块的module是一次生成,同样针对require.main 也是相同,相关值都将被缓存起来

// global
const { fun } = require('./buffer');
fun();
require('./index');
// buffer
exports.fun = () => {
  console.log(module);
  console.log(require.main);
}
const { fun } = require('./buffer');
fun();
global中执行结果:

Module {
  id: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
  exports: { fun: [Function] },
  parent:
   Module {
     id: '.',
     exports: {},
     parent: null,
     filename: '/Users/ligen/code/github/nodeStudy/build/gobal.js',
     loaded: false,
     children: [ [Circular] ],
     paths:
      [ '/Users/ligen/code/github/nodeStudy/build/node_modules',
        '/Users/ligen/code/github/nodeStudy/node_modules',
        '/Users/ligen/code/github/node_modules',
        '/Users/ligen/code/node_modules',
        '/Users/ligen/node_modules',
        '/Users/node_modules',
        '/node_modules' ] },
  filename: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
  loaded: true,
  children: [],
  paths:
   [ '/Users/ligen/code/github/nodeStudy/build/node_modules',
     '/Users/ligen/code/github/nodeStudy/node_modules',
     '/Users/ligen/code/github/node_modules',
     '/Users/ligen/code/node_modules',
     '/Users/ligen/node_modules',
     '/Users/node_modules',
     '/node_modules' ] }
Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/Users/ligen/code/github/nodeStudy/build/gobal.js',
  loaded: false,
  children:
   [ Module {
       id: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
       exports: [Object],
       parent: [Circular],
       filename: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
       loaded: true,
       children: [],
       paths: [Array] } ],
  paths:
   [ '/Users/ligen/code/github/nodeStudy/build/node_modules',
     '/Users/ligen/code/github/nodeStudy/node_modules',
     '/Users/ligen/code/github/node_modules',
     '/Users/ligen/code/node_modules',
     '/Users/ligen/node_modules',
     '/Users/node_modules',
     '/node_modules' ] }
     
index中执行结果:

Module {
  id: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
  exports: { fun: [Function] },
  parent:
   Module {
     id: '.',
     exports: {},
     parent: null,
     filename: '/Users/ligen/code/github/nodeStudy/build/gobal.js',
     loaded: false,
     children: [ [Circular], [Object] ],
     paths:
      [ '/Users/ligen/code/github/nodeStudy/build/node_modules',
        '/Users/ligen/code/github/nodeStudy/node_modules',
        '/Users/ligen/code/github/node_modules',
        '/Users/ligen/code/node_modules',
        '/Users/ligen/node_modules',
        '/Users/node_modules',
        '/node_modules' ] },
  filename: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
  loaded: true,
  children: [],
  paths:
   [ '/Users/ligen/code/github/nodeStudy/build/node_modules',
     '/Users/ligen/code/github/nodeStudy/node_modules',
     '/Users/ligen/code/github/node_modules',
     '/Users/ligen/code/node_modules',
     '/Users/ligen/node_modules',
     '/Users/node_modules',
     '/node_modules' ] }
Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/Users/ligen/code/github/nodeStudy/build/gobal.js',
  loaded: false,
  children:
   [ Module {
       id: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
       exports: [Object],
       parent: [Circular],
       filename: '/Users/ligen/code/github/nodeStudy/build/buffer.js',
       loaded: true,
       children: [],
       paths: [Array] },
     Module {
       id: '/Users/ligen/code/github/nodeStudy/build/index.js',
       exports: {},
       parent: [Circular],
       filename: '/Users/ligen/code/github/nodeStudy/build/index.js',
       loaded: false,
       children: [Array],
       paths: [Array] } ],
  paths:
   [ '/Users/ligen/code/github/nodeStudy/build/node_modules',
     '/Users/ligen/code/github/nodeStudy/node_modules',
     '/Users/ligen/code/github/node_modules',
     '/Users/ligen/code/node_modules',
     '/Users/ligen/node_modules',
     '/Users/node_modules',
     '/node_modules' ] }

2、循环引用情况说明

循环引用情况处理:

// a.js
console.log('a 开始');
exports.done = false;
const b = require('./b.js');
console.log('在 a 中,b.done = %j', b.done);
exports.done = true;
console.log('a 结束');
// b.js
console.log('b 开始');
exports.done = false;
const a = require('./a.js');
console.log('在 b 中,a.done = %j', a.done);
exports.done = true;
console.log('b 结束');
// main.js
console.log('main 开始');
const a = require('./a.js');
const b = require('./b.js');
console.log('在 main 中,a.done=%j,b.done=%j', a.done, b.done);
// output

main 开始
a 开始
b 开始
在 b 中,a.done = false
b 结束
在 a 中,b.done = true
a 结束
在 main 中,a.done=true,b.done=true
@Genluo Genluo added the Node Node相关 label Sep 6, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Node Node相关
Projects
None yet
Development

No branches or pull requests

1 participant