6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Node.jsで普通のJavaScriptをimportする

Last updated at Posted at 2024-04-24

ES ModulesでもCommonJS でもUMDでもない普通のJavaScriptをimportする方法を調べました。ブラウザで動作するスクリプトをテストしたいときにご活用ください

普通のJavaScript

script.js
class MyClass {
    hello() {
        return 'こんにちは'
    }
}

普通のJavaScriptを変更することなくimportする

eval⭐⭐⭐⭐⭐

main.mjs
import { readFileSync } from 'node:fs'

eval(readFileSync('script.js') + ';global.MyClass=MyClass')

console.assert(new MyClass().hello() === 'こんにちは', 'あいさつすること')

普通のJavaScriptを変更しなくていいのでオススメ

import⭐⭐⭐

main.mjs
import { readFileSync } from 'node:fs'

const script = readFileSync('script.js') + ';export { MyClass }'
const { MyClass } = await import('data:text/javascript;base64,' + Buffer.from(script).toString('base64'))

console.assert(new MyClass().hello() === 'こんにちは', 'あいさつすること')

evalのときよりも複雑

普通のJavaScriptを変更してimportする

eval⭐⭐⭐⭐

script.js
class MyClass {
    hello() {
        return 'こんにちは'
    }
}

globalThis.MyClass = MyClass
main.mjs
import './script.js'

console.assert(new MyClass().hello() === 'こんにちは', 'あいさつすること')

テストコードがシンプルになるのでオススメ

エラーが発生したときに分かりやすい
image.png

Node.js環境だけ晒すのもありよりのあり

script.js
class MyClass {
    hello() {
        return 'こんにちは'
    }
}

if (typeof global === 'object') global.MyClass = MyClass

import⭐⭐

script.mjs
class MyClass {
    hello() {
        return 'こんにちは'
    }
}

export { MyClass }
main.mjs
import { MyClass } from './script.mjs'

console.assert(new MyClass().hello() === 'こんにちは', 'あいさつすること')

script.jsscript.mjsに変えたり、scriptタグにtype=module属性を付与する手間が増えるのでオススメできない

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?