为什么nodejs的module.js里用了readFileSync而不用readFile

为什么nodejs的module.js里用了readFileSync而不用readFile,第1张

进一步说,之所以同步是 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 的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9666767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存