チュートリアル
最初のバンドルの作成
開始する前に、Node.jsをインストールしてNPMを使用できるようにする必要があります。また、お使いのマシンでコマンドラインにアクセスする方法も知る必要があります。
Rollupを使用する最も簡単な方法は、コマンドラインインターフェイス(またはCLI)を使用することです。ここでは、ロールアップをグローバルにインストールします(後で、ビルドプロセスを移植できるようにプロジェクトにローカルにインストールする方法を学習します。心配しないでください)。コマンドラインに以下を入力します
npm install rollup --global
# or `npm i rollup -g` for short
rollup
コマンドを実行できるようになりました。試してみてください。
rollup
引数が渡されなかったため、Rollupは使用方法を出力します。これはrollup --help
またはrollup -h
を実行することと同じです。
簡単なプロジェクトを作成してみましょう
mkdir -p my-rollup-project/src
cd my-rollup-project
まず、エントリポイントが必要です。src/main.js
という名前の新しいファイルに以下を貼り付けます
// src/main.js
import foo from './foo.js';
export default function () {
console.log(foo);
}
次に、エントリポイントがインポートするfoo.js
モジュールを作成します
// src/foo.js
export default 'hello world!';
これでバンドルを作成する準備が整いました
rollup src/main.js -f cjs
-f
オプション(--format
の略)は、作成するバンドルの種類を指定します。この場合は、CommonJS(Node.jsで実行されます)。出力ファイルを指定しなかったため、stdout
に直接印刷されます
'use strict';
const foo = 'hello world!';
const main = function () {
console.log(foo);
};
module.exports = main;
バンドルをファイルとして保存することもできます
rollup src/main.js -o bundle.js -f cjs
(rollup src/main.js -f cjs > bundle.js
を実行することもできますが、後ほど説明するように、ソースマップを生成している場合は柔軟性が低くなります。)
コードを実行してみてください
node
> var myBundle = require('./bundle.js');
> myBundle();
'hello world!'
おめでとう!Rollupで最初のバンドルを作成しました。
構成ファイルの使用
ここまで順調ですが、オプションを追加し始めるとコマンドを入力するのが少し面倒になります。
重複を避けるために、必要なすべてのオプションを含む構成ファイルを作成できます。構成ファイルはJavaScriptで記述され、生のCLIよりも柔軟です。
プロジェクトのルートにrollup.config.mjs
という名前のファイルを作成し、次のコードを追加します
// rollup.config.mjs
export default {
input: 'src/main.js',
output: {
file: 'bundle.js',
format: 'cjs'
}
};
(CJS モジュールを使用できることに注意してください。したがって、module.exports = {/* config */}
になります。)
設定ファイルを使用するには、-c
または -c
フラグを使用します。
rm bundle.js # so we can check the command works!
rollup -c
設定ファイルのオプションは、同等のコマンドラインオプションでオーバーライドできます。
rollup -c -o bundle-2.js # `-o` is equivalent to `--file` (formerly "output")
注: Rollup 自体が設定ファイルを処理するため、export default
構文を使用できます。コードは Babel や同様のものでトランスパイルされていないため、実行している Node.js のバージョンでサポートされている ES2015 機能のみを使用できます。
特に指定しない限り、デフォルトの rollup.config.mjs
以外の設定ファイルを使用できます。
rollup --config rollup.config.dev.mjs
rollup --config rollup.config.prod.mjs
ローカルに Rollup をインストールする
チーム内や分散環境で作業する場合、ローカル 依存関係として Rollup を追加するのが賢明です。ローカルに Rollup をインストールすると、複数の貢献者が追加の手順として Rollup を個別にインストールする必要がなくなります。しかも貢献者全員が同じバージョンの Rollup を使用できることを保証します。
NPM でローカルに Rollup をインストールするには
npm install rollup --save-dev
またはYarn で
yarn -D add rollup
インストールすると、Rollup はプロジェクトのルートディレクトリ内で実行できます。
npx rollup --config
またはYarn で
yarn rollup --config
インストールしたら、package.json
に単一のビルドスクリプトを追加するのが一般的です。これにより、すべての貢献者にとって便利なコマンドが提供されます。例:
{
"scripts": {
"build": "rollup --config"
}
}
注: ローカルにインストールされた場合、NPM と Yarn の両方が依存関係のバイナリファイルを解決し、パッケージスクリプトから呼び出されたときに Rollup を実行します。
プラグインを使用する
今までは、エントリポイントと相対パスでインポートされたモジュールから簡単なバンドルを作成しました。より複雑なバンドルを作成する場合は、柔軟性が必要になることがよくあります。NPM でインストールされたモジュールのインポート、Babel でのコードのコンパイル、JSON ファイルでの作業などが挙げられます。
それにはプラグインを使用します。これにより、バンドル化プロセスの重要なポイントで Rollup の動作が変更されます。優れたプラグインのリストは Rollup Awesome List で管理されています。
このチュートリアルでは、@rollup/plugin-json を使用します。これにより、Rollup は JSON ファイルからデータをインポートできます。
プロジェクトのルートに package.json
というファイルを作成し、次の内容を追加します。
{
"name": "rollup-tutorial",
"version": "1.0.0",
"scripts": {
"build": "rollup -c"
}
}
@rollup/plugin-json を開発依存関係としてインストールします。
npm install --save-dev @rollup/plugin-json
(コードは実行中にプラグインに依存しないため、--save
ではなく --save-dev
を使用しています。バンドルを構築する場合のみです。)
src/main.js
ファイルを更新し、src/foo.js
の代わりに package.json
からインポートします。
// src/main.js
import { version } from '../package.json';
export default function () {
console.log('version ' + version);
}
JSON プラグインを含めるように rollup.config.mjs
ファイルを編集します。
// rollup.config.mjs
import json from '@rollup/plugin-json';
export default {
input: 'src/main.js',
output: {
file: 'bundle.js',
format: 'cjs'
},
plugins: [json()]
};
npm run build
で Rollup を実行します。結果は次のようになります。
'use strict';
var version = '1.0.0';
function main() {
console.log('version ' + version);
}
module.exports = main;
注: 実際に必要なデータだけがインポートされます。name
、devDependencies
、package.json
の他の部分は無視されます。これが ツリーシェイキング の仕組みです。
出力プラグインを使用する
一部のプラグインは特定の出力を対象に適用することもできます。出力固有のプラグインが行えることの詳細については、プラグインフックを参照してください。簡単に言うと、これらのプラグインはRollupのメイン分析が完了した後にのみコードを変更できます。 Rollupでは互換性のないプラグインが出力固有のプラグインとして使用されている場合に警告されます。考えられるユースケースの1つは、ブラウザで消費されるバンドルの最小化です。
最小化されたビルドを非最小化されたビルドと一緒に提供するために、前の例を拡張しましょう。 そのために、@rollup/plugin-terser
をインストールします。
npm install --save-dev @rollup/plugin-terser
2番目の最小化された出力の追加に対応するようにrollup.config.mjs
ファイルを編集します。 フォーマットとしてiife
を選択します。 このフォーマットでは、コードがラップされ、他のコードとの不要な相互作用を回避しながらブラウザでscript
タグ経由で利用できるようになります。 エクスポート値があるため、バンドルによって作成されるグローバル変数の名前を指定して、他のコードがこの変数を使用してエクスポート値にアクセスできるようにする必要があります。
// rollup.config.mjs
import json from '@rollup/plugin-json';
import terser from '@rollup/plugin-terser';
export default {
input: 'src/main.js',
output: [
{
file: 'bundle.js',
format: 'cjs'
},
{
file: 'bundle.min.js',
format: 'iife',
name: 'version',
plugins: [terser()]
}
],
plugins: [json()]
};
Rollupはbundle.js
の他に2番目のファイルbundle.min.js
を作成します。
var version = (function () {
'use strict';
var n = '1.0.0';
return function () {
console.log('version ' + n);
};
})();
コード分割
コード分割では、動的ロードや複数のエントリポイントのようにRollupが自動的にコードをチャンクに分割する場合があり、output.manualChunks
オプションを使用して、分割するモジュールをRollupに明示的に指定する方法があります。
コード分割機能を使用して遅延ダイナミックロード(インポートされた一部のモジュールが関数の実行後にロードされる場合)を実現するには、元の例に戻り、src/foo.js
を静的にロードするのではなく動的にロードするようにsrc/main.js
を変更します。
// src/main.js
export default function () {
import('./foo.js').then(({ default: foo }) => console.log(foo));
}
Rollupは動的インポートを使用して、オンデマンドでのみロードされる別個のチャンクを作成します。 Rollupに2番目のチャンクを配置する場所を知らせるために、--file
オプションを渡す代わりに、--dir
オプションを使用して出力を送信するフォルダーを設定します。
rollup src/main.js -f cjs -d dist
これにより、main.js
とchunk-[hash].js
という2つのファイルが含まれるdist
フォルダーが作成されます([hash]はコンテンツベースのハッシュ文字列)。 output.chunkFileNames
オプションとoutput.entryFileNames
オプションを指定して、独自の名前付けパターンを指定できます。
コードは、以前と同じ出力を使用して実行し続けることができますが、./foo.js
のロードと解析はエクスポートされた関数を初めて呼び出したときにのみ開始するため、少し遅くなります。
node -e "require('./dist/main.js')()"
--dir
オプションを使用しない場合、Rollupはチャンクを再度stdout
に出力し、コメントを追加してチャンクの境界を強調表示します。
//→ main.js:
'use strict';
function main() {
Promise.resolve(require('./chunk-b8774ea3.js')).then(({ default: foo }) =>
console.log(foo)
);
}
module.exports = main;
//→ chunk-b8774ea3.js:
('use strict');
var foo = 'hello world!';
exports.default = foo;
使用されるまで高価な機能を読み込んで解析する場合にのみ便利です。
コード分割の別の用途は、いくつかの依存関係を共有する複数のエントリポイントを指定できることです。 この例では再び、元の例で行ったようにsrc/foo.js
を静的にインポートする2番目のエントリポイントsrc/main2.js
を追加します。
// src/main2.js
import foo from './foo.js';
export default function () {
console.log(foo);
}
両方のエントリポイントをrollupに提供すると、3つのチャンクが作成されます。
rollup src/main.js src/main2.js -f cjs
出力されます。
//→ main.js:
'use strict';
function main() {
Promise.resolve(require('./chunk-b8774ea3.js')).then(({ default: foo }) =>
console.log(foo)
);
}
module.exports = main;
//→ main2.js:
('use strict');
var foo_js = require('./chunk-b8774ea3.js');
function main2() {
console.log(foo_js.default);
}
module.exports = main2;
//→ chunk-b8774ea3.js:
('use strict');
var foo = 'hello world!';
exports.default = foo;
エントリポイントの両方が同じ共有チャンクをインポートする方法に注目できます。Rollupはコードを複製しません。それらの代わりに、絶対に必要な最小限のみを読み込む追加チャンクを作成します。繰り返しになりますが、--dir
オプションを渡すと、ファイルがディスクに書き込まれます。
ネイティブのESモジュール、AMDローダーまたはSystemJSを使用してブラウザーに対して同じコードを作成できます。
たとえば、ネイティブモジュールに対して-f es
と共に
rollup src/main.js src/main2.js -f es -d dist
<!doctype html>
<script type="module">
import main2 from './dist/main2.js';
main2();
</script>
またはネイティブモジュールに対して-f system
と共に
rollup src/main.js src/main2.js -f system -d dist
SystemJSを介してインストールします
npm install --save-dev systemjs
必要に応じて、HTMLページにいずれかのエントリポイントまたは両方のエントリポイントを読み込みます
<!doctype html>
<script src="node_modules/systemjs/dist/s.min.js"></script>
<script>
System.import('./dist/main2.js').then(({ default: main }) => main());
</script>
ネイティブESモジュールをサポートしているブラウザー上でそれらを使用するウェブアプリの設定方法に関する例については、rollup-starter-code-splittingを参照してください。必要に応じて、SystemJSにフォールバックします。