我对Symfony 3.4中的Encore和资产版本控制有疑问。
在我的webpack.config.js
中,我有两种配置。
第一个用于JS文件,另一个用于编译.less。
每个配置都由Encore.reset()重置
输出包通过.enableVersioning
生成带有版本控制的清单,所以我有两个manifest.json
web/js/manifest.json
web/stylesheets/manifest.json
根据文档,要通过清单加载我的资产,我需要在config.yml
中声明它
assets:
base_path: "%myapp.http.site_assets_suffix%"
stylesheets:
json_manifest_path: "%kernel.project_dir%/web/assets/stylesheets/manifest.json"
如果我想链接到webpack生成的style.css
,我会使用
asset("stylesheets/style.css")
但是在我的应用程序中,我有两个清单,由于两个Encore配置,我认为无法更改。
我尝试添加喜欢的东西
packages:
stylesheets:
json_manifest_path: "%kernel.project_dir%/web/assets/stylesheets/manifest.json"
js:
json_manifest_path: "%kernel.project_dir%/web/assets/js/manifest.json"
因为我在某个地方看到了它,但不幸的是,这根本不起作用。
我已经考虑过在最后一个Webpack入口点将两个清单合并为一个清单,但这可能很耗时。
除了将Manfiest结合或将js +较少的编译结合到一个Encore大任务中,还有其他解决方案吗?
答案 0 :(得分:0)
我找到了解决方法
assets:
base_path: 'path%'
packages:
noversion:
version: false
version_format: "%%1$s"
base_path: "path%"
stylesheets:
json_manifest_path: "%kernel.project_dir%/web/assets/stylesheets/manifest.json"
js:
json_manifest_path: "%kernel.project_dir%/web/assets/js/manifest.json"
admin:
json_manifest_path: "%kernel.project_dir%/web/assets/js/admin/manifest.json"
然后在.twig
文件中,您需要将其命名为
<script src="{{ asset('assets/DIRNAME/WEBPACK_ENTRY_NAME_HERE', ASSET_PACKAGE_NAME_HERE) }}"></script>
就我而言
<script src="{{ asset('assets/js/backend.js', 'js') }}"></script>
在我的情况下,WEBPACK_ENTRY_NAME
是webpack.config.js
中Webpack / Encore捆绑软件的名称
.setOutputPath('./web/assets/js')
.setPublicPath('/assets/js')
.addEntry('backend',
很抱歉延迟回答,但我忘了。
答案 1 :(得分:0)
Webpack Encore使用webpack-manifest-plugin生成manifest.json
文件。
根据文档,您可以在设置配置时指定options.seed
。
用于种子清单的键/值对的缓存。这可能包括要包含在清单中的一组自定义键/值对,或可能用于在多编译器模式下合并各个编译中的清单。要合并清单,请将共享的种子对象传递给每个编译器的ManifestPlugin实例。
Encore.configureManifestPlugin(options => {
let seed;
try {
// require your existing manifest content if exists
seed = require(path.join(outputPath, 'manifest.json'));
}
catch (e) {
// fallback if manifest.json is missing
seed = {};
}
// inject your latest config as seed.
// The plugin will update it and rewrite manifest.json with correct values (overwrite existing keys, append news)
options.seed = seed;
// Also i add a trick to avoid "License.txt" entries
options.generate = function(seed, files, entrypoints) {
// trick to avoid generate useless versionned entries like License
const filesWithoutLicense = files.filter(file => {
return file.path.match(/.*LICENSE.*/) === null;
});
const newManifestContent = filesWithoutLicense.reduce(
(newManifestContent, file) => {
newManifestContent[file.name] = file.path;
return newManifestContent;
},
seed
);
return newManifestContent;
}