进一步说,之所以同步是 Nodejs 所遵循的 CommonJS 的模块规范要求的。
在当年,CommonJS 社区对此就有很多争议,导致了坚持异步的 AMD 从 CommonJS 中分裂出来。
CommonJS
模块是同步加载和同步执行,AMD 模块是异步加载和异步执行,CMD(Seajs)模块是异步加载和同步执行。ES6
的模块体系最后选择的是异步加载和同步执行。也就是 Seajs 的行为是最接近 ES6 模块的。不过 Seajs
这样做是需要付出代价的——需要扫描代码提取依赖,所以它不像 CommonJS/AMD 是纯运行时的模块系统。
注意 Seajs 是
2010年之后开发的,提出 CMD 更晚。Nodejs 当年(2009年)只有 CommonJS 和 AMD 两个选择。就算当时已经有
CMD 的等价提案,从性能角度出发,Nodejs 不太可能选择需要静态分析开销的 类 CMD 方案。考虑到 Nodejs
的模块是来自于本地文件系统,最后 Nodejs 选择了看上去更简单的 CommonJS 模块规范,直到今天。
consolelog(envTEST) //aaa
consolelog(envNODE_ENV) //local
return {
devtool: 'inline-source-map',
entry: {
vendor: [
'react',
'react-dom',
。。。
}
}
}
```
- 注意点:
- 如果你的服务是通过webpack-dev-server启动
- 如果直接在命令行中使用TEST=aa webpack-dev-server
- 那么就只能在webpackconfigjs中的moduleexport回调函数中通过processenvTEST访问到传入的值
- 而不能在code中访问到
每一个Nodejs执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}
moduleexports = {};11
exports和moduleexports指向同一块内存,但require()返回的是moduleexports而不是exports。
var str = "difference"
exportsa = str;
exportsb = function () {
}
给 exports 赋值其实是给 moduleexports 这个空对象添加了两个属性而已,上面的代码相当于:
var str = "difference"
moduleexportsa = str;
moduleexportsb = function () {
}
你可以去阅读下Node的modulejs模块就理解了。 require有三个点,require(‘pluginLoaderjs’): 解析出pluginLoaderjs的path,读取该文件 将pluginLoaderjs里的代码丢到一个context运行,获取moduleexports,moduleexports会被保存下来
以上就是关于为什么nodejs的module.js里用了readFileSync而不用readFile全部的内容,包括:为什么nodejs的module.js里用了readFileSync而不用readFile、js process对象解惑、Node.js模块导出exports 和 module.exports 的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)