通过使用 webpack-s3-plugin
npm 包,我将我的 laravel-mix 编译和版本化文件保存到 S3(用于 cdn 目的)。
请记住,直到昨天,这一直有效。
let webpackPlugins = [];
if (mix.inProduction() && process.env.UPLOAD_S3) {
webpackPlugins = [
new s3Plugin({
include: /.*\.(css|js)$/,
s3Options: {
accessKeyId: process.env.AWS_KEY,
secretAccessKey: process.env.AWS_SECRET,
region: process.env.AWS_REGION,
},
s3UploadOptions: {
Bucket: process.env.ASSETS_S3_BUCKET,
CacheControl: 'public, max-age=31536000'
},
basePath: 'assets/' + process.env.APP_ENV,
directory: 'public'
})
]
}
mix.scripts([ // I also tried '.combine'
'resources/js/vendor/vendor/jquery.slimscroll.js',
'resources/js/vendor/custom/theme-app.js',
], 'public/js/scripts.js')
// Other bundling stuff
.js([...].version()
mix.webpackConfig({
plugins: webpackPlugins
});
现在,S3 的 eTag 与 mix-manifest.json
哈希不匹配。而且,当我访问该页面时,它会落后 1 个版本,不是最新上传的版本,而是恰好 1 个以前的版本。但是,当我检查 S3 上的“更新日期”时,它是正确的。尽管如此,它恰好落后一个版本。
我怀疑它是在捆绑完全完成之前上传到 s3;但是我不确定。我在这里缺少什么?
<支持> 我用了this guide如果你想详细了解 laravel 方面。
最佳答案
在深入了解 S3 插件源之后,我相当确信这是由用于触发 S3 上传的 Hook 引起的。我对 webpack 插件知之甚少,无法对此进行完整描述,但我对导致该问题的原因进行了有根据的猜测,我提出的修复方案似乎已经解决了该问题。
插件的作者已经接受了我的拉取请求,修复目前正在等待发布。
如果你同时需要修复,那么你可以这样做(注意,这很脏,应该被视为临时修复):
- 浏览到您的
node_modules
文件夹 - 找到名为
webpack-s3-plugin
的文件夹 - 复制文件
dist/s3_plugin.js
- 粘贴到你项目的某处
- 打开文件并找到行
t.hooks.afterEmit.tapPromise
- 替换为
t.hooks.done.tapPromise
- 在您的
webpack.mix.js
文件中,将require('webpack-s3-plugin')
更改为指向您的 javascript 文件
重申一下,这是一个临时修复,直到发布最新版本的插件。
关于在 S3 中上传时的 Laravel-mix 版本控制在以前的哈希中思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57380123/