Webpack adapter for Nette framework consisting of:
- DI extension
- entry point chunks resolver (uses webpack
manifest.json
) - UI components to render assets
<script>
and<link>
tags - webpack config helper to manage your setup consistently with
neon
files
Install the DI extension via Composer.
composer require wavevision/nette-webpack
The webpack helper can be installed via Yarn
yarn add --dev @wavevision/nette-webpack
or npm
npm install --save-dev @wavevision/nette-webpack
Register DI extension in your app config.
extensions:
webpack: Wavevision\NetteWebpack\DI\Extension(%debugMode%, %consoleMode%)
You can configure the extension as follows (default values).
webpack:
debugger: %debugMode%
devServer:
enabled: %debugMode%
url: http://localhost:9006
dir: %wwwDir%/dist
dist: dist
entries: []
manifest: manifest.json
debugger: boolean
β enable Tracy panel with useful development informationdevServer.enabled: boolean
β serve assets fromwebpack-dev-server
devServer.url: string
βwebpack-dev-server
public URLdir: string
β absolute path to webpack build directorydist: string
β webpack build directory nameentries: Record<string, boolean>
β webpack entry points that should be considered when resolving assetsmanifest: string
β webpack manifest name
Then, setup entry chunks.
use Nette\Application\UI\Presenter;
use Wavevision\NetteWebpack\InjectResolveEntryChunks;
use Wavevision\NetteWebpack\UI\Components\Assets\AssetsComponent;
final class AppPresenter extends Presenter
{
use AssetsComponent;
use InjectResolveEntryChunks;
public function actionDefault(): void
{
$this
->getAssetsComponent()
->setChunks($this->resolveEntryChunks->process('entry'));
}
}
Note: Entry chunks are resolved based on webpack
manifest.json
. You can also set chunks manually and/or separately withsetScripts
andsetStyles
methods.
Finally, render assets
in your layout.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>Wavevision Nette Webpack</title>
{control assets:styles}
</head>
<body>
{include content}
{control assets:scripts}
</body>
</html>
Should you need it, you can inject and use following services to further customize your setup:
NetteWebpack
β provides basic methods to work with the extensionFormatAssetName
β formats and resolves asset URL based on provided nameFormatChunkName
β formats chunk names for specific content types and resolves their URL
This simple utility will help you to manage your project setup and webpack configs consistently. It will also provide
you with pre-configured webpack-manifest-plugin to
generate manifest.json
with extra chunks
property that is used to dynamically resolve entry chunks in your application.
import { WebpackHelper } from '@wavevision/nette-webpack';
The helper constructor accepts following arguments:
neonPath?: string
β path to aneon
in whichwebpack
is configured (if not provided, default values will be used)wwwDir: string
β mandatory path to applicationwwwDir
manifestOptions?: WebpackManifestPlugin.Options
β if you need to customize manifest plugin setup, you can do it here
The returned class exposes following methods:
createManifestPlugin(): WebpackManifestPlugin
β creates manifest plugin instancegetDevServerPublicPath(): string
β returns resolvedwebpack-dev-server
URL withdist
included in pathgetDevServerUrl(): UrlWithParsedQuery
β returnswebpack-dev-server
parsed URL objectgetDist(): string
β returnsdist
parametergetEntries(): Record<string, boolean>
β returns records of configured webpack entriesgetEnabledEntries(): string[]
β returns list of webpack entries that havetrue
configuredgetManifest(): string
β returns webpack manifest file namegetOutputPath(): string
β returns resolved path to webpack output directoryparseNeonConfig<T extends NeonConfig>(): T
β returns parsedneon
config (throws error ifneonPath
is not defined)
Note: You can also import
Neon
helper if you want to parse and work with moreneon
files.
See example webpack config to see it all in action.
ManyοΈ π to JiΕΓ Pudil for his WebpackNetteAdapter which we used in our projects and served as an inspiration for this library.