require('./module').defaultについて
GWから乃木坂にハマりました、お久しぶりです。
後輩氏がjsやってて、なんだこれってツイート見たので書いとこうってモチベ
jsのモジュール
JSのモジュールはけっこういっぱいある(nodeのcommonjsがcommonjsじゃない問題はめんどくさいので置いとく)
よく見るのは下の2種類
- ES Modules: ECMA Scriptの仕様
- CommonJS: Node.jsが採用してるモジュールシステム
ES Modulesの実装状況
chromeとかedgeみたいな一部だと実装されてるけど
ES Modulesで書かれたものは基本動かない
なのでNode.jsで動かす時なんかはcommonjsに変換する
commonjsへの変換
esmodules => commonjsの変換はBabelやTypescript使う気がする
今回はbabel使って試してみる
変換
とりあえずesmodulesで書かれたものを用意する
export default class Nogizaka { constructor() {} }
これをbabelで変換(babel-preset-es2015とか)すると
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Nogizaka = function Nogizaka() { _classCallCheck(this, Nogizaka); }; exports.default = Nogizaka;
重要なのはexports.default
の部分で、export default
になってるのでrequire('./module').default
と書く必要が出て来る
これをNode.jsとかのコードでよく見るmodule.exports = Nogizaka
にしたい
module.exports = Nogizakaしたい
babelにはbabel-plugin-add-module-exports
ってプラグインがある
それを使用するとmodule.exports
の行が追加される
npm i -D babel-plugin-add-module-exports
babel --presets=es2015 --plugins=add-module-exports index.js
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Nogizaka = function Nogizaka() { _classCallCheck(this, Nogizaka); }; exports.default = Nogizaka; module.exports = exports["default"];
これで一応.default
しなくてもrequire('./module')
でいけるようになる
まとめ
乃木坂はいいぞー