ES6之Module 的加载实现(2)
3.Node 加載
Node 對 ES6 模塊的處理比較麻煩,因為它有自己的 CommonJS 模塊格式,與 ES6 模塊格式是不兼容的。目前的解決方案是,將兩者分開,ES6 模塊和 CommonJS 采用各自的加載方案
3.1在靜態分析階段,一個模塊腳本只要有一行import或export語句,Node 就會認為該腳本為 ES6 模塊,否則就為 CommonJS 模塊。如果不輸出任何接口,但是希望被 Node 認為是 ES6 模塊,可以在腳本中加一行語句
上面的命令并不是輸出一個空對象,而是不輸出任何接口的 ES6 標準寫法
3.2import 命令加載 CommonJS 模塊
Node 采用 CommonJS 模塊格式,模塊的輸出都定義在module.exports這個屬性上面。在 Node 環境中,使用import命令加載 CommonJS 模塊,Node 會自動將module.exports屬性,當作模塊的默認輸出,即等同于export default
import命令加載上面的模塊,module.exports會被視為默認輸出
如果采用整體輸入的寫法(import * as xxx from someModule),default會取代module.exports,作為輸入的接口直接賦予在對象上成為屬性**
上面代碼中需要注意的是,整體的輸出,Node 會自動為baz添加default屬性,通過baz.default才能拿到module.exports
bar本身是一個對象,不能當作函數調用,只能通過bar.default調用
CommonJS 模塊的輸出緩存機制,在 ES6 加載方式下依然有效
即,CommonJS輸出緩存的機制導致即使通過import加載了foo.js文件,得到的結果依然是緩存里的123
由于 ES6 模塊是編譯時通過export確定輸出接口,而CommonJS 模塊是運行時確定輸出接口,所以采用import命令加載 CommonJS 模塊時,不允許采用下面的寫法(不要添加大括號,因為等價于輸出的是export default)
上面的寫法不正確,因為fs的書寫是 CommonJS 格式的,只有在運行時才能確定readfile接口,而import命令要求編譯時就確定這個接口。解決方法就是改為整體輸入
這里的’express’就沒有出現大括號的形式
3.3require 命令加載 ES6 模塊
采用require命令加載 ES6 模塊時,ES6 模塊的所有輸出接口,會成為輸入對象的屬性
上面代碼中,ES6模塊的default接口變成了通過require產生的es_namespace.default對象的屬性。另外,由于CommonJS的輸出緩存機制,所以es.js在已經輸出foo后再對foo的重新賦值沒有在模塊外部反映出來
總結
以上是生活随笔為你收集整理的ES6之Module 的加载实现(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows 查看ttf字体
- 下一篇: 三种场景不建议放在关系型数据库中