複雑すぎる。
参考
前回
http://ytyaru.hatenablog.com/entry/2019/03/25/000000
JSモジュール化する規格とその実装
規格 | 実装 | 形態 |
---|---|---|
CommonJS | browserify | Node.js npm モジュール |
AMD | require | JSライブラリ |
UMD | umd | Node.js npm モジュール? |
ES2015 | import、トランスパイラ(Babel) | 言語仕様(構文) |
何が違う?
AMD
define(['jquery'] , function ($) { return function () {}; });
以下のように書くこともできる。
define(function (require) { var $ = require('jquery') return function () {}; });
- トランスパイル不要(非同期にJSを読み込む)
- requireを使ってブラウザのみで実装できる
CommonJS
var $ = require('jquery'); exports.myExample = function () {};
- 実行前にJSソースコードをトランスパイルして単一JSファイルにする
- Node.jsが必要
UMD
AMDとCommonJSの記法をサポート。
ES2015
import $ from "jquery"
import
構文が標準実装されているブラウザなら動作する。未実装ブラウザで動作させるには、トランスパイルしたコードにする必要がある。
- ブラウザ標準実装 (ES6 の ES Moduleも?)
- 標準の構文であるためライブラリ読込不要
- トランスパイル不要
- JavaScript モジュールの現状 | POSTD
- トランスパイル
- Babel等を使ってES6(ES2015)未実装でも動作するJSコード(ES5)にビルドする
- Node.js
- webpack, browseflyなどによりファイル結合することで可
- ブラウザ
- Babel on CDNでは
import
できない
- Babel on CDNでは
- Node.js
どれを使うべき?
結論は出せない。コードの規模や実効速度などによって最適な選択がかわる。
Node.js必須
ES2015が実装されたならそれをつかうべき。トランスパイル不要でコードも単純。
ES2015が実装されていないなら、トランスパイル環境を整えて開発すべき。コードの保守性と実効速度の面において最良。(ただし環境構築が非常に面倒。コードを変更する度にトランスパイルが必要なのも)
ブラウザのみ
Node.js不要。初心者はこれ一択か。CDNでライブラリ参照すればすぐ使える。ただしAMDのみ。CommonJS式でのモジュール化は原理的にできない。
require
requireのCDNを使えばブラウザのみで実装できる。AMD。コードが微妙。Node.jsとの互換性がない。セキュリティ制約によりローカルで動作確認できない。トランスパイル不要なのでその環境を用意しなくていいのがメリットか。また、遅延読込のため、起動速度は高速か。
欠点のほうが多いので、トランスパイル環境を整えて開発するのが一般的な模様。
CommonJSは不可
browserifyにCDNはない。そもそも別ファイルをひとつに統合する処理はローカルかサーバサイドでないと不可能。クライアントサイドだけでファイル結合はできない。
BabelのCDNを用いて動的トランスパイルできる。ただしimport
構文は使えない。上記browserifyの問題があるため。