yak shaving life

遠回りこそが最短の道

Node.jsでrequireするとrequire is not definedエラーが出る

という話を聞いた。自分が遭遇したわけではない。これってどういう時に起こるんだろうか。ブラウザ上でrequireするとこうなるのは知っているのが…。

気になったので適当に色々試していたら、ESMを使わなければいけない環境でrequireしようとすると出るっぽい。 例えばこんな感じのファイルを2つ作成します

// module_exports.js
module.exports = { a: () => { return "module.exports!" }}
// require.js
const {a} = require('./module_exports.js')
console.log(a())

require.jsはちゃんと動きます

$ node require.js
module.exports!

次にpackage.jsonを作ってESModulesを有効にします

// package.json
{
    "type": "module"
}

この状態でrequire.jsを実行すると件のエラーが出ます。

$ node require.js
const {a} = require('./module_exports.js')
            ^

ReferenceError: require is not defined

BabelやらTSを利用している場合の挙動はよく知りませんが、とにかくこのエラーが出るときは大体こういう原因なんじゃないでしょうか。素直にimportを使えば解決。

// export.js
let a; export default a = () => { return "export!" }
// import.js
import a from './export.js'
console.log(a())