前言
采用了 Commonjs 规范,通过 module.exports、require 来导出和导入模块。模块加载机制中,采用了延迟加载的策略。就是说在用到的情况下,系统模块才会被加载,等加载完成后会放到 binding_cache 中。
分类(模块类型)
系统模块
第三方模块
文件形式
加载机制
加载步骤
经历 路径分析、文件定位和编译执行。
加载顺序
关于缓存问题
模块缓存后,可以通过 require.cache 查看已缓存的模块。
// 模块文件 require.module.jsmodule.exports = { name: 'pr', say(){ }}
// 引用模块文件 require.cache.jsrequire('./require.module');console.log('require.cache ----- ');console.log(require.cache);
对象引用
1.exports 与 module.exports 关系
const exports = module.exports;
所以就不能改变 exports 的指向,可以这样
exports.info = { name: 'pr', age: 30}module.exports = { name: 'pr', age: 30}
模块循环引用
模块 moduleA.js 和 moduleB.js 两个模块互相引用,会怎样?
// moduleA.jsconsole.log('模块 moduleA');exports.name = 'moduleA name';age = 27;const moduleB = require('./moduleB.js');console.log('moduleA require moduleB =>', moduleB.name);
// moduleB.jsconsole.log('模块 moduleB');exports.name = 'moduleB name';const moduleA = require('./moduleA.js');console.log('moduleB require moduleA =>', moduleA.name);
很有意思的是,在代码执行前,会用一个封装器将执行代码段封装起来
(function(exports, require, module, __filename, __dirname) { // something});
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对武林网的支持。
新闻热点
疑难解答