这是我们的项目使用的技术栈:
[我们有一个问题,我们的app.min.js
文件已被缓存,并且当我们进行更改时需要一个新的app.min.js
文件时,我们的客户通常会继续使用该缓存的文件,而不是加载新文件并最终生成错误并不得不请致电我们的支持台。
我已经研究过解决此问题的方法,即将文件内容的哈希值嵌入到HTTP请求中,然后让服务器使用重写规则来提供原始文件。我已经将[contenthash].
添加到了webpack.config.js
中的文件名中(见下文),但是当我运行Webpack时,它并不能替代[contenthash]
,而是使用该确切名称创建文件。
[contenthash]
我想发生的是:
module.exports = {
output: {
filename: 'app.min.[contenthash].js'
}
}
和app.min.js
app.min.js.map
链接到app.min.js.map
app.min.6b1900549fed191ccbe8.js
app_min_js_hash: '6b1900549fed191ccbe8'
所以我有一些尚未解决的问题:
我已经知道如何解决重写和Twig的部分。
跟随链接的问题(<script src="/dist/js/app.min.{{ app_min_js_hash }}.js"></script>
)中的评论,我现在得到:
webpack.config.js
HtmlWebpackPlugin load bundle.[hash].js/css into base twig file
在Twig代码var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var webpackMajorVersion = require('webpack/package.json').version.split('.')[0];
module.exports = {
console: true,
name: 'js',
entry: ['./src/base.js'],
output: {
path: '../web/dist/js/',
publicPath: '/dist/js/',
filename: 'app.min.[hash].js'
},
devtool: "source-map",
resolve : {
root : [path.join(__dirname, "src/")]
},
sassLoader: {
includePaths: './src/'
},
resolveLoader: {
root: __dirname+'/node_modules/',
modulesDirectories: [""]
},
jshint: {
esversion: 6
},
// Initialize module
preLoaders: [],
module: {
preLoaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'jshint-loader',
}
],
loaders: [{
// JS LOADER
// Reference: https://github.com/babel/babel-loader
// Transpile .js files using babel-loader
// Compiles ES6 and ES7 into ES5 code
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel',
query: {
presets: ['es2015']
},
exclude: /node_modules/
}, {
// ASSET LOADER
// Reference: https://github.com/webpack/file-loader
// Copy png, jpg, jpeg, gif, svg, woff, woff2, ttf, eot files to output
// Rename the file using the asset hash
// Pass along the updated reference to your code
// You can add here any file extension you want to get copied to your output
test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,
loader: 'file'
}, {
// HTML LOADER
// Reference: https://github.com/webpack/raw-loader
// Allow loading html through js
test: /\.html$/,
loader: "ngtemplate?relativeTo=" + (path.resolve(__dirname, './src/')) + "/!html"
}, {
test: /\.scss$/,
loaders: ["style", "css", "sass"]
}],
resolve: {
// you can now require('file') instead of require('file.coffee')
extensions: ['', '.js', '.json', '.coffee']
}
},
plugins: [
new HtmlWebpackPlugin({
templateContent: function(params) {
return `
{% block jsAssets %}
${params.htmlWebpackPlugin.files.js.map(
file => `<script src="${file}"></script>`,
)}
{% endblock %}
{% block cssAssets %}
${params.htmlWebpackPlugin.files.css.map(
file => `<link rel="stylesheet" type="text/css" href="${file}">`,
)}
{% endblock %}`;
},
filename: '../../resources/templates/assets.html.twig',
inject: false,
// // The following settings are optional and only used for
// // demo purposes:
// meta: {
// charset: { charset: 'utf-8' },
// viewport: 'width=device-width, initial-scale=1'
// },
// minify: false
})
]
};
执行任何操作之前,必须use
生成的Twig模板。
Twig:
{{ block("jsAssets", "assets.html.twig") }}
所以现在剩下的唯一问题是如何在每次生成哈希文件的同时保持输出文件名相同。否则,该目录将继续填充不同的哈希版本(不是很小)。只需要最新的文件。我们使用一步式部署,因此每次生成文件时都必须手动重命名该文件。
†我已经知道这个版本太旧了。短期内不会改变。
这是我们项目使用的技术堆栈:Symfony 2.8†Twig 1.24†AngularJS 1.5†Webpack 1.12†我们遇到了一个问题,即我们的app.min.js文件被缓存,并且在进行更改时需要一个新的...] >
在webpack 1中,它称为{% use 'HTMLBundle:Layout:assets.html.twig' %}
...
{{ block("jsAssets", "assets.html.twig") }}
...
。您不需要发明轮子。
HTMLWebpack插件支持将哈希值注入到html(甚至php模板)中,即开即用