Webpack Encore ドキュメント
pieceofcake2/webpack-encore は、Symfony Webpack Encore でビルドしたアセット (CSS、JS、画像) を CakePHP 2 アプリケーションに組み込むためのビューヘルパーを 提供します。entrypoints.json と manifest.json を読み込んでフィンガープリント付きのアセットの ファイル名を解決し、適切な <link>、<script>、<img> タグを出力します。
インストール
Composer でプラグインをインストールします。
bashcomposer require pieceofcake2/webpack-encoreこのプラグインは
cakephp-pluginタイプなので、composer/installersによってプラグインディレクトリに インストールされます。正しい場所にインストールされるように、アプリケーションのcomposer.jsonでinstaller-pathsを設定してください。レイアウト installer-pathsモダン ( config/,src/,templates/,plugins/)"plugins/{$name}/": ["type:cakephp-plugin"]レガシー ( app/Config/,app/Plugin/)"app/Plugin/{$name}/": ["type:cakephp-plugin"]config/bootstrap.php(レガシーレイアウトではapp/Config/bootstrap.php) でプラグインを読み込みます。 すでにCakePlugin::loadAll()を使っている場合は不要です。phpCakePlugin::load('WebpackEncore');webroot の
build/ディレクトリ (webroot/build/、レガシーレイアウトではapp/webroot/build/) に Encore のアセットをビルドします。プロジェクトのルートで次を実行します。bashnpm install npm run encore devこれで次のファイルが生成されます。
webroot/build/entrypoints.jsonwebroot/build/manifest.jsonwebroot/build/内のコンパイル済みの.js、.css、画像ファイル
コントローラー、たとえば
src/Controller/AppController.php(レガシーレイアウトではapp/Controller/AppController.php) でヘルパーを読み込みます。phpApp::uses('Controller', 'Controller'); class AppController extends Controller { public $helpers = ['Html', 'WebpackEncore.Encore']; }これでビューから
$this->Encoreを使えるようになります。
設定
デフォルトでは、ヘルパーは次の場所にファイルがあることを想定しています。
entrypoints.jsonはWWW_ROOT . 'build/entrypoints.json'manifest.jsonはWWW_ROOT . 'build/manifest.json'
これらのファイルを別の場所に置く場合は、config/bootstrap.php (レガシーレイアウトでは app/Config/bootstrap.php) でファイルシステム上のフルパスを設定してください。
// entrypoints.json のファイルシステム上のフルパス
Configure::write('WebpackEncore.entrypointsPath', WWW_ROOT . 'build/entrypoints.json');
// manifest.json のファイルシステム上のフルパス
Configure::write('WebpackEncore.manifestPath', WWW_ROOT . 'build/manifest.json');ヘルパーのメソッド
asset($assetPath)
1 つの論理的なアセットのパス (manifest.json のキー) を、最終的なフィンガープリント付きの URL に 解決します。マニフェストにないパスはそのまま返します。
// manifest.json の内容が次のとおりの場合:
// {
// "build/images/logo.png": "/build/images/logo.3eed42.png"
// }
echo $this->Encore->asset('build/images/logo.png');
// 出力: /build/images/logo.3eed42.pngimage($assetPath, array $htmlAttributes = [])
manifest.json を使って解決した画像アセットの <img> タグを出力します。
// 出力: <img src="/build/images/cake_logo.3eed42.png" alt="CakePHP" />
echo $this->Encore->image('build/images/cake_logo.png', ['alt' => 'CakePHP']);css($assetPaths, array $options = [])
CSS アセットの <link> タグを 1 つ以上出力します。第 1 引数には文字列か文字列の配列を指定できます。 各パスは manifest.json を使って解決され、オプションとともに HtmlHelper::css() に渡されます。
// CSS ファイルが 1 つの場合
echo $this->Encore->css('build/app.css');
// CSS ファイルが複数の場合
echo $this->Encore->css([
'build/vendors.css',
'build/app.css',
]);script($assetPaths, array $options = [])
JavaScript アセットの <script> タグを 1 つ以上出力します。文字列か文字列の配列を受け取ります。 各パスは manifest.json を使って解決され、オプションとともに HtmlHelper::script() に渡されます。
// JS ファイルが 1 つの場合
echo $this->Encore->script('build/app.js');
// JS ファイルが複数の場合
echo $this->Encore->script([
'build/runtime.js',
'build/vendors.js',
'build/app.js',
], ['defer' => true]);HtmlHelper と同じように、['inline' => false] を渡すとタグを返す代わりに css または script ビューブロックに追加し、['block' => 'name'] を渡すと別のブロックに追加します。
entryLinkTags($entryName, array $options = [])
entrypoints.json を読み込み、指定したエントリー (たとえば app や dashboard) のすべての CSS ファイルについて <link> タグを出力します。デフォルトではタグを css ビューブロックに追加します。 タグを文字列として受け取るには ['inline' => true] を渡してください。
// entrypoints.json の例:
// {
// "entrypoints": {
// "app": {
// "css": ["/build/vendors.3d4e5f.css", "/build/app.abc123.css"],
// "js": ["/build/runtime.0a1b2c.js", "/build/vendors.3d4e5f.js", "/build/app.123abc.js"]
// }
// }
// }
// app エントリーの CSS ファイルの <link> タグ 2 つを css ブロックに追加します
$this->Encore->entryLinkTags('app');entryScriptTags($entryName, array $options = [])
entrypoints.json を読み込み、指定したエントリーのすべての JS ファイルについて <script defer> タグを出力します。デフォルトではタグを script ビューブロックに追加します。タグを文字列として 受け取るには ['inline' => true] を、defer を付けないようにするには ['defer' => false] を 渡してください。
// app エントリーの JS ファイルの <script> タグ 3 つを script ブロックに追加します
$this->Encore->entryScriptTags('app');レイアウトの例
templates/Layouts/default.ctp (レガシーレイアウトでは app/View/Layouts/default.ctp) で次のようにします。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?= $this->fetch('title') ?></title>
<?php
// 'app' エントリーの CSS と JS を css ブロックと script ブロックに追加します
$this->Encore->entryLinkTags('app');
$this->Encore->entryScriptTags('app');
?>
<?= $this->fetch('css') ?>
<?= $this->fetch('script') ?>
</head>
<body>
<header>
<!-- マニフェストを使って画像を出力します -->
<?= $this->Encore->image('build/images/cake_logo.png', ['alt' => 'CakePHP']) ?>
</header>
<div class="content">
<?= $this->fetch('content') ?>
</div>
</body>
</html>entryLinkTags('app')は、appエントリーのすべての CSS の<link>タグをcssブロックに追加します。entryScriptTags('app')は、appエントリーのすべての JS の<script defer>タグをscriptブロックに追加します。スクリプトは遅延実行されるので、<head>で読み込んでもかまいません。image()メソッドは、画像アセットを解決して<img>タグを出力します。
注意事項
- フロントエンドのコードを変更したら、アセットを再ビルド (
npm run encore devまたはnpm run encore production) してentrypoints.jsonとmanifest.jsonを更新してください。 - ヘルパーは、両方の JSON ファイル内のパスが
/build/...で始まることを想定しています。別のディレクトリを 使う場合は、JSON の出力を調整するか、それに合わせてWebpackEncore.entrypointsPathとWebpackEncore.manifestPathを設定してください。 - ヘルパーは、最初にアセットが要求されたときに各 JSON ファイルを読み込み、そのリクエストの間は キャッシュします。ヘルパーの読み込み時にはファイルは必要ありませんが、最初のビルドの前にアセットを 出力しようとすると、見つからないファイルの名前を含む
RuntimeExceptionがスローされます。
由来
このパッケージは pieceofcake2 が作成し、メンテナンスしています。 他のプロジェクトのフォークではなく、他のプロジェクトをもとにしたものでもありません。
