有没有办法只对 webpack 中的特定资源(图像)禁用 filenameHashing?
Is there a way to disable filenameHashing only for specific resources (images) in webpack?
在使用 vue-cli
使用 Vue.js 2.6.2
构建我的网站后,我遇到了静态资源(在本例中为图像)的问题。 Webpack 将它们捆绑在 /img/
文件夹中,这很好,但是图像被赋予了像 image_demo.25d62d92.png
这样的哈希值,这在尝试从外部源访问这些资源时会导致问题,例如来自另一个网站。
webpack 有一个选项可以完全禁用 filenameHashing
,但如果没有对网站上所有或她的图像的缓存控制,这是一个太大的牺牲。
理想的解决方案是选择只使用一些没有额外哈希的默认名称的手工挑选资源,而其他资源使用默认 hash
进行缓存控制。
是的,有办法。您需要覆盖 vue-cli
附带的 'images' 规则。
vue inspect --rule images
产生以下结果:
$ vue inspect --rule images
/* config.module.rule('images') */
{
test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'img/[name].[hash:8].[ext]'
}
}
}
}
]
}
(提示:vue inspect
是一个有用的工具,可用于弄清楚为什么使用 vue-cli
构建时事物的行为会像它们那样)
所有图片
vue-cli
建议 webpack-chain
用于 'advanced' 配置。我个人不是粉丝,但如果您想删除所有图像的哈希值,您可能应该修改 'images' 规则。像这样编辑 vue.config.js
:
module.exports = {
// ...
chainWebpack: (config) => {
config.module
.rule("images")
.use("url-loader")
.loader("url-loader")
.tap((options) => {
options.fallback.options.name = "img/[name].[ext]"
return options
})
}
// ...
}
具体图片
在我的例子中,我只想删除具有唯一前缀的特定图像组的哈希值,因此我将以下内容添加到 vue.config.js
中的 configureWebpack
:
module.exports = {
// ...
configureWebpack: {
module: {
rules: [
{
test: /unique-prefix-\d*\.png/, // <= modify this to suit your needs
use: [
{
loader: "url-loader",
options: {
limit: 4096,
fallback: {
loader: "file-loader",
options: {
name: "img/[name].[ext]", // <= note how the hash is removed
},
},
},
},
],
},
],
},
// ...
}
也可以用 webpack-chain
来完成,但我更喜欢更普通的 Webpack 配置格式。
在使用 vue-cli
使用 Vue.js 2.6.2
构建我的网站后,我遇到了静态资源(在本例中为图像)的问题。 Webpack 将它们捆绑在 /img/
文件夹中,这很好,但是图像被赋予了像 image_demo.25d62d92.png
这样的哈希值,这在尝试从外部源访问这些资源时会导致问题,例如来自另一个网站。
webpack 有一个选项可以完全禁用 filenameHashing
,但如果没有对网站上所有或她的图像的缓存控制,这是一个太大的牺牲。
理想的解决方案是选择只使用一些没有额外哈希的默认名称的手工挑选资源,而其他资源使用默认 hash
进行缓存控制。
是的,有办法。您需要覆盖 vue-cli
附带的 'images' 规则。
vue inspect --rule images
产生以下结果:
$ vue inspect --rule images
/* config.module.rule('images') */
{
test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 4096,
fallback: {
loader: 'file-loader',
options: {
name: 'img/[name].[hash:8].[ext]'
}
}
}
}
]
}
(提示:vue inspect
是一个有用的工具,可用于弄清楚为什么使用 vue-cli
构建时事物的行为会像它们那样)
所有图片
vue-cli
建议 webpack-chain
用于 'advanced' 配置。我个人不是粉丝,但如果您想删除所有图像的哈希值,您可能应该修改 'images' 规则。像这样编辑 vue.config.js
:
module.exports = {
// ...
chainWebpack: (config) => {
config.module
.rule("images")
.use("url-loader")
.loader("url-loader")
.tap((options) => {
options.fallback.options.name = "img/[name].[ext]"
return options
})
}
// ...
}
具体图片
在我的例子中,我只想删除具有唯一前缀的特定图像组的哈希值,因此我将以下内容添加到 vue.config.js
中的 configureWebpack
:
module.exports = {
// ...
configureWebpack: {
module: {
rules: [
{
test: /unique-prefix-\d*\.png/, // <= modify this to suit your needs
use: [
{
loader: "url-loader",
options: {
limit: 4096,
fallback: {
loader: "file-loader",
options: {
name: "img/[name].[ext]", // <= note how the hash is removed
},
},
},
},
],
},
],
},
// ...
}
也可以用 webpack-chain
来完成,但我更喜欢更普通的 Webpack 配置格式。