Open5

CJS => ESM

Masayuki HigashinoMasayuki Higashino

.eslintrc.js

拡張子をcjsに変更する。

$ mv .eslintrc.js .eslintrc.cjs

.eslint.cjssourceType: "module"を追加する。

parserOptions: {
+  sourceType: "module"
}
Masayuki HigashinoMasayuki Higashino

commonjs-to-es-module-codemod

commonjs-to-es-module-codemodでESMに変換する。

$ npm install jscodeshift -g
$ npm add commonjs-to-es-module-codemod --save-dev
  • commonjs-to-es-module-codemodをnode_modulesにインストールしないとうまく動かなかった。

まとめて変換する場合:

$ find src -name "*.js" | xargs jscodeshift -t node_modules/commonjs-to-es-module-codemod/dist/index.js

一つずつ変換する場合:

$ jscodeshift -t node_modules/commonjs-to-es-module-codemod/dist/index.js "src/index.js"
Masayuki HigashinoMasayuki Higashino

手動変換

-const router = require("express-promise-router")();
+import Router from "express-promise-router";
+const router = Router();
-const CONSTNTS = require("../constants.js");
+import CONSTNTS from "../constants.js";
-module.exports = CONSTNTS;
+export default CONSTNTS;
-const JSON_FILE = require("./file.json");
+import path from "path";
+const dirname = path.dirname(new URL(import.meta.url).pathname);
+const JSON_FILE = JsonUtils.load(path.resolve(dirname, "./file.json"));
-const {
-  Parser,
-  transforms: { flatten },
-} = require("json2csv");
+import { Parser } from "json2csv";
+import flatten from "json2csv/lib/transforms/flatten.js";
-app.use("/", require("./routes/cats.js"));
+import cats from "./routes/cats.js";
+appApi.use("/", cats);
class Cat {
}
-module.exports.Cat = Cat;
+export { Cat };

関数の中に書かれているrequireも手動で直す。例えば以下の様な書き方。

async function main() {
  const admin = require("firebase-admin");
}