我目前正在将 Webpack 集成到现有的服务器端渲染的多页面应用程序中,以利用 Webpack 周围的现代工具和生态系统。
这主要是一次很好的体验,但我目前正在努力集成到我们的服务器端代码中,尤其是使用散列和平面文件夹结构的生产构建。基本思想非常简单:所有资产都由 Webpack 管理,并在webpack-manifest-plugin
我的帮助下生成一个 manifest.json,由我们的服务器端应用程序读取。使用辅助函数,我会将路径static/images/logo.png
变成logo-[hash].png
.
这对 js/css 文件非常有用(其中只有我的入口点的包名称是相关的),但是我在生成包含静态资产(如图像和文档)所需的必要信息的 manifest.json 文件时遇到问题。
部分 Webpack 配置
这是我的 webpack 配置的相关部分:
{
entry: {
index: './js/app.js',
"static-assets": './js/static-assets.js'
},
output: {
filename: '[name].js'
},
resolve: {
alias: {
"vendor-assets": "dependencyX/assets",
}
},
plugins: [
new WebpackManifestPlugin()
],
module: {
rules: [
{
test: /\.(png|svg|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
name: isDev ? '[path][name].[ext]' : '[hash].[ext]',
}
}
]
}
]
}
}
方法一:copy-webpack-plugin
我尝试了这样的配置:
new CopyWebpackPlugin([
{
from: './static',
to: isDev ? '[path][name].[ext]' : '[name].[hash].[ext]'
},
{
from: 'node_modules/dependencyX/assets/img',
to: isDev ? 'vendor-assets/[path][name].[ext]' : '[name].[hash].[ext]'
},
])
问题 1:在清单中,我只得到新位置的键,但根本没有关于原始路径的信息:
"logo.png": "logo.d985ee06aa950d9232f80c09a9e1329f.png"
代替:
"node_modules/dependencyX/assets/img/logo.png": "logo.d985ee06aa950d9232f80c09a9e1329f.png",
甚至更好地考虑我定义的别名:
"vendor-assets/img/logo.png": "logo.d985ee06aa950d9232f80c09a9e1329f.png",
问题 2:由于 copy-webpack-plugin 似乎做了一个简单的复制,所以会有重复的问题。如果我也从常规包中引用这些静态资产之一,它将再次出现在输出文件夹中。
方法 2:静态资产包
我的第二种方法是定义一个捆绑包,该捆绑包static-assets.js
使用以下方式引用静态资产的所有可能位置request.context
:
require.context('../static', true, /.+/);
require.context('vendor-assets/img', true, /.+/);
问题:与复制方法一样,生成的清单仅包含简单文件名作为键,而不包含原始路径。
问题
- 有没有简单的方法通过配置来解决这个问题?
- 还有其他方法吗?