利用 std/esm 在 Node.js 開發中使用 ES Modules

利用 std/esm 在 Node.js 開發中使用 ES Modules 整理自ES Modules in Node Today!,從屬於筆者的現代 JavaScript 開發:語法基礎與實踐技巧系列中的模塊化與構建章節。本文主要介紹瞭如何利用 std/esm 第三方庫在 Node.js 應用中順滑地使用 ES Modules 語法。node

利用 std/esm 在 Node.js 開發中使用 ES Modules

隨着主流瀏覽器逐步開始支持 ES Modules 標準,愈來愈多的目光投注於 Node.js 對於 ESM 的支持實現上;目前 Node.js 使用 CommonJS 做爲官方的模塊解決方案,雖然內置的模塊方案促進了 Node.js 的流行,可是也爲引入新的 ES Modules 形成了必定的阻礙。CommonJS 與 ES Modules 模塊標準的對好比下:git

// CJS
const a = require("./a")
module.exports = { a, b: 2 }

// ESM
import a from "./a"
export default { a, b: 2 }

鑑於 CommonJS 並不兼容於 ES Modules,Node.js 打算引入 .mjs(Modular JavaScript)文件擴展來指明模塊解析規則;這個有點相似於目前對於 JSON 文件的解析,若是咱們指明瞭載入 .json 格式文件,Node.js 會自動調用 JSON.parse 方法。Node.js 擬計劃在 2020 年發佈的 9.x 版本中引入內置的 ESM 支持,詳細的 Node.js 中 ESM 實現規範查看 Node.js 官方文檔 ES Module Interoperability;而目前主流的辦法便是採用 Rollup、Webpack 這樣的構建工具或者 Babel 這樣的轉化工具來進行代碼轉化。github

而近日正式發佈的 @std/esm 爲咱們提供了高性能的 Node.js 中 CommonJS 與 ES Modules 模塊間調用,其可以做用於 Node.js 4.x 以上版本;它可以順滑地集成到現有的 Webpack、Babel 環境中,而且支持不一樣模塊使用不一樣的依賴版本。不一樣於目前的解決方案須要是發佈編譯以後的 CommonJS 格式的文件,[@std/esm] 可以以最小的代價的、按需轉化的、動態緩存的方式來進行源代碼轉化,其基本命令行中的使用方式以下所示:npm

> require('@std/esm')
@std/esm enabled
> import path from 'path';
undefined
> path.join("Hello","World");
'Hello/World'

[@std/esm] 除了會自動識別 .mjs 擴展的文件以外,它還支持任何包含 import/export、Dynamic import、file URI scheme 等語句的文件,典型的用例以下:json

// 首先安裝依賴
npm i --save @std/esm

// index.js

import hello from "./main.js";

hello();


// main.js
import thing from "./constants.js";

export default function hello() {
console.log(thing);
}

// constants.js

export default "Hello World!";

// 運行文件
node -r @std/esm index.js
// Hello World!

筆者在本身嘗試的時候發現 @std/esm 還存在些 Bug,對於緩存代碼的處理也並不完善,目前並不建議直接用於生產環境,可是有所瞭解仍是不錯的。@std/esm 官方給出的與 Node.js 9 以及 CommonJS 模塊的加載時間對好比下,能夠發現仍是很接近於內建的解決方案性能的:瀏覽器

  • Loading CJS equivs was ~0.28 milliseconds per module
  • Loading built-in ESM was ~0.51 milliseconds per module
  • First @std/esm no cache run was ~1.56 milliseconds per module
  • Secondary @std/esm cached runs were ~0.54 milliseconds per module

延伸閱讀

相關文章
相關標籤/搜索