Skip to content

CommonJS 轉換至 ES Module

近幾年逐漸把專案當中 CommonJS 都轉換成了 ESM,應該是長期做前端已習慣 ESM 而比較少在寫 NodeJS 的關係,看到 CommonJS 的 require module.exports 就會覺得不順眼,因此逢遇專案要做更新,都會順手將 CommonJS 轉換成 ESM。

我認為 js 就是 js,專案若不是做成 lib 就應該統一一種模組系統就好,不要使用 .mjs .cjs 副檔名的方式來讓 Node 區分 ESM 與 CommonJS,因此我會直接在 package.json 中設定 "type": "module" 以顯示聲明專案就是 ESM only。

json
{
  "type": "module"
}

接著就是將 CommonJS 轉換成 ESM,這個過程其實不難,就是將 require 寫法改成 import,以及 module.exports 改成 export defaultexport,然後留意一下 named import 有沒有出錯需要改寫即可,大部分的知名套件都已經支援 ESM,所以轉換上都是無痛的,如果有問題 compiler 就會先報錯,所以也不需要特別擔心有漏網之魚。

如果專案使用 Webpack 伴隨而生的問題之一就是使用 import 必須明確加上副檔名,例如 import foo from "./foo",必須改成 import foo from "./foo.js",可以使用 resolve.fullySpecified 設定解決這個問題,就不需要顯性加入副檔名。

js
export default {
  module: {
    rules: [
      {
        test: /\.js$/,
        resolve: {
          fullySpecified: false
        }
      }
    ]
  }
};

再來就是如果使用到 require.context 這個 API,需要用 import.meta.webpackContext 改寫。

js
const context = import.meta.webpackContext("controllers", {
  regExp: /controller\.js$/
});
Written By
YI FENG XIE
YI FENG XIE

Creative Problem Solver