2020/06/20

[js]requireとimport

今まで読んでいたJavaScriptのサンプルコードでは、外部モジュール(npmでインストールしたものなど)を使いたいときにはrequire()が使われていた。
なので、C言語で言うところのincludeみたいなものだろうと解釈していた。

 

require()ってどういうパスの解釈をするのだろう、と調べようとしたのだが、なんだかimportというものが出てきた。
時代の流れで変わってしまったとかだろうか?


一番わかりやすいのがここだった。

export / import と exports / require - Qiita
https://qiita.com/kumagaias/items/c8e87bbea496a5351234

なるほど、require()はNode.jsなのか。
だからそれしか見たことが無かったのかもしれない(ブラウザのことを考えていないので)。

Node.js v12.18.1で動かしてみる。

 

 

expo84.js

let Expo = 84;

function ExpoFunc(val) {
    return val + 84;
}

export { Expo, ExpoFunc }

 

expo_use.js

import { Expo, ExpoFunc } from './expo84.js'

console.log(Expo);
console.log(ExpoFunc(10));

$ node expo_use.js
(node:24541) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
/home/ueno/Prog/expo_use.js:1
import { Expo, ExpoFunc } from './expo84.js'
^^^^^^

SyntaxError: Cannot use import statement outside a module
  ...

 

モジュールとわからせないといけない?
あるいは拡張子が.mjsならよい?

 

expo84.mjs

let Expo = 84;

function ExpoFunc(val) {
    return val + 84;
}

export { Expo, ExpoFunc }

 

expo_use.js

import { Expo, ExpoFunc } from './expo84.mjs'

console.log(Expo);
console.log(ExpoFunc(10));

 

あれ、これでもダメ??

 

 

expo84.mjs

let Expo = 84;

function ExpoFunc(val) {
    return val + 84;
}

export { Expo, ExpoFunc }

 

expo_use.mjs

import { Expo, ExpoFunc } from './expo84.mjs'

console.log(Expo);
console.log(ExpoFunc(10));

$ node expo_use.mjs
(node:24577) ExperimentalWarning: The ESM module loader is experimental.
84
94

 

expo84.jsに戻すとそれはそれでエラーになったので、拡張子を変える場合は呼ばれる方も呼ぶ方も.mjsでないとダメとか?

 

require()を使うなら、こういう感じか。

 

expo84.js

let Expo = 84;

function ExpoFunc(val) {
    return val + 84;
}

module.exports = { Expo, ExpoFunc }

 

expo_use.js

const myexpo = require('./expo84.js');

console.log(myexpo.Expo);
console.log(myexpo.ExpoFunc(10));

$ node expo_use.js
84
94

 

うん、もうrequire()でいいや。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。