使用时:copy-webpack-plugin
并指定to:
为:'images/[name].[contenthash][ext]'
如何在不使用html-webpack-plugin
或handlebars-loader
的情况下在模板中引用这些文件?
我用以下解决方案解决了这个问题:
/**
* Create a new plugin class.
*/
const StoreAssetsInfoKeysPlugin = class StoreAssetsInfoKeysPlugin {
/**
* Define `apply` as its prototype method.
* @param hooks
*/
apply({ hooks }) {
/**
* Using the 'afterCompile' hook:
* Use the 'assetsInfo' Map which contains the output of all asset paths,
* construct an array containing all these paths,
* then write an 'assets.json' file somewhere in your project.
*/
hooks.afterCompile.tapAsync('StoreAssetsInfoKeysPlugin', ({ assetsInfo }, callback) => {
fs.writeFileSync('/path/to/assets.json', JSON
.stringify(Array
.from(assetsInfo.entries())
.map(([key]) => `/assets/${key}`)));
callback();
});
}
};
/**
* The Webpack configuration for this
* example looks like this.
*/
export default {
plugins: [
new StoreAssetsInfoKeysPlugin(),
new CopyPlugin({
patterns: [{
from: '/path/to/images/*',
to: 'images/[name].[contenthash][ext]',
}],
}),
],
};
/**
* Create a helper function which will find the
* correct path from the 'assets.json'
*/
export const getAssetPath = function getAssetPath(directory, filename, ext) {
return JSON
.parse(fs.readFileSync('/path/to/assets.json'))
.find((value) => value
.match(`^.*?\\b${directory}\\b.*?\\b${filename}\\b.*?\\.${ext}\\b.*?$`));
};
/**
* Then use the helper function within your
* server-side templating engine:
*/
getAssetPath('images', 'my-image', 'svg');
这是一个合适的解决方案吗?
这是我第一个在服务器端模板中用[contenthash]
替换来获取文件名的解决方案。
我是Webpack的新手,所以对这种方法的任何想法都将受到赞赏。
1条答案
按热度按时间2skhul331#
我试着详细定义目标:
1.我们有一个模板文件(例如index.hbs)
1.在源模板文件中应引用
source files
的脚本、样式、图像和其他资源1.在处理后的模板文件中,应该散列
output filenames
,其中包含contenthash
1.模板文件必须不呈现为HTML,才能通过服务器端呈现使用模板
目标是否正确?
如果是,那么你可以使用一个强大的“html-plugin-webpack-plugin”没有
html-webpack-plugin
,handlebars-loader
,copy-webpack-plugin
.例如,下面是示例的文件结构:
字符串
有一个源模板文件
src/views/index.hbs
(或其他HTML文件):型
型
如果您将保留原始模板内容,并且仅使用其散列输出文件名替换源资源文件,则使用
preprocessor: false
插件选项禁用渲染。处理后的(未呈现为html)模板将如下所示:
型
如果你要将任何模板渲染成HTML,你可以使用一个支持的模板引擎“开箱即用”:Eta,EJS,Handlebars,Nunjucks,LiquidJS。
插件的配置,以呈现HTML格式的工具栏模板:
型
呈现的HTML:
型