la-haute-societe / craft-webpack-assets
Webpack assets for Craft CMS
Installs: 3 647
Dependents: 0
Suggesters: 0
Security: 0
Stars: 6
Watchers: 5
Forks: 0
Open Issues: 2
Type:craft-plugin
Requires
- craftcms/cms: ^3.0.0-RC1
This package is auto-updated.
Last update: 2024-12-07 00:21:57 UTC
README
A simple plugin allowing to handle Webpack generated CSS and Javascript assets within Craft CMS templates.
Requirements
This plugin requires Craft CMS 3.0.0-RC1 or later. It is intended to work with Webpack 2 or 3.
Installation
- Install with composer from your project directory:
composer require la-haute-societe/craft-webpack-assets
Webpack setup
- To generate the intended JSON files, add the following NPM packages:
yarn add html-webpack-plugin write-file-webpack-plugin underscore-template-loader -D
# Or
npm install html-webpack-plugin write-file-webpack-plugin underscore-template-loader --save-dev
- Somewhere in your assets source folder, create a
assets-files.json.tpl
file with the following content :
<%= JSON.stringify( htmlWebpackPlugin ) %>
- In the Webpack config add the following plugins :
{ plugins: [ new HtmlWebpackPlugin({ filename: 'generated-assets-files.json', template: 'underscore-template-loader!path/to/templates/assets-files.json.tpl', inject: false, chunksSortMode: 'dependency' }), new WriteFilePlugin({ test: /generated-assets-files\.json$/, force: true, log: false }) ] }
Adjust the
template
value to the path of the previously createdassets-files.json.tpl
file.
- Finally, run your Webpack process, as usual.
Configuration
In the config
folder at the root of your Craft project, create a webpackassets.php
file with the following content
and adjust the path to the JSON generated by Webpack.
<?php return [ 'jsonPath' => realpath(__DIR__ . '/path/to/generated-assets-files.json'), ];
Usage
In your Twig templates, you can include your Webpack generated assets as follow:
<html> <head> ... {{ craft.webpackAssets.cssTags() | raw }} ... Or with chunk name ... {{ craft.webpackAssets.cssTags('app') | raw }} ... </head> <body> ... {{ craft.webpackAssets.jsTags() | raw }} ... Or with chunk name ... {{ craft.webpackAssets.jsTags('app') | raw }} {{ craft.webpackAssets.jsTags('libs') | raw }} ... </body> </html>
You can detect if the public path provided by webpack is an absolute URL with the method isPublicPathAbsoluteUrl
(this is the case when assets are served by Webpack).
If needed, you can override the webpack public path at runtime when this path is not absolute :
{% if not craft.webpackAssets.isPublicPathAbsoluteUrl() %}
<script>
runtime_webpack_public_path = '{{ siteUrl }}assets/';
</script>
{% endif %}
Brought to you by La Haute Société