It’s a way in Node.js to use import and export like in the browser, so you can split your code into small files and keep everything easy to read and work with.
Node.jsでブラウザと同じように import と export が使え、ファイルを分けて読み書きしながら分かりやすく作れる仕組みのことです。
require() / module.exports という独自方式でモジュールを扱っていましたimport / export というモジュール方式が標準ですESM(ECMAScript Modules) とは「import / export を使ってモジュールを扱う、JavaScriptの標準ルール」のことです。
つまり ESM は…
import が書けるmoduleA.js
JavaScript
export function hello() {
console.log("Hello!");
}
main.js
JavaScript
import { hello } from "./moduleA.js";
hello();
ブラウザでも Node.js でも同じように動く、というのがメリット。
Node.js は昔からの require 方式(CommonJS)をサポートしていたので、ESM を使うためには「これ ESM で書いてますよ!」と Node.js に示す必要があります。
方法は2つ。
JSON
{
"type": "module"
}
これで .js が ESM として扱われる。
JavaScript
import something from "./other.mjs";
.mjs は自動的に ESM として扱われる。
結論:
import/export(ESM)でOKrequire が残っていることがあるJavaScript
import express from "express";
を使いたいのに
JavaScript
SyntaxError: Cannot use import statement outside a module
が出る → "type": "module" を忘れているケースが多い。
require / module.exports)を採用していたが、Node.js v12 以降で ESM が本格的に利用可能になったimport / export は静的解析が可能なため、ツリーシェイキング、事前読み込み、最適化などの長所がある.mjs または "type": "module" が ESM のシグナルrequire と import は混在できるが制約がある(特に default export や相互読み込み)