Symfony Encore多个资源清单

6

我有一个关于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入口点中将两个清单合并成一个,但这可能会耗费时间。

除了将清单合并或将JS + less编译合并成一个大的Encore任务之外,还有其他解决方法吗?


你能分享一下你的 webpack.config.js 文件吗? - mblaettermann
@svantetic,你解决了吗?如果解决了,请分享你的解决方案,回馈社区。 - YahyaE
@YahyaE 添加了一个答案。 - svantetic
2个回答

3

我已经找到了一个解决方案


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/Encore捆绑包的名称,来自于webpack.config.js文件,在我的情况下。

.setOutputPath('./web/assets/js')
    .setPublicPath('/assets/js')
    .addEntry('backend',

抱歉回复晚了,我忘记了。


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;
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接