Web Laravel Mix4 配置extract和lazy load component
gogo
因为laravel-mix 4有些奇怪的问题,这里记录一下
想用以下2个功能:
- extract
extract()在lm4引入的.是把dependencies的包打包为vendor.js, 应用部分为app.js ,vendor不常变, 可缓存起来,优化访问.
- lazy load import
动态加载组件的js,不把组件打包到1个文件里.这是spa的组件化的一个基础.
//设置manifest.json的输出目录,也就是dist的根目录
mix.setPublicPath('../../public/spa');
mix.config.webpackConfig.output = {
// chunkFilename: 'chunk/[name].[chunkhash].js',
chunkFilename: '[name].chunk.js',
//为lazy load的componnets js文件设置url目录
//比较重要
publicPath: '/spa/'
};
mix.i18n()
//第2个参数为输出目录,相对上面设置的setPublicPath
.js('src/app.js','js').version()
.sass('sass/post.scss','css').version()
//将原来的app.js分为manifest.js , vendor.js 和app.js,在blade里分别引用就好.
mix.extract();
生成的目录如下:
├── css
│ └── app.css
├── js
│ ├── app.chunk.js #改动较大的chunk,
│ ├── manifest.js
│ └── vendor.chunk.js # 提取vendor的,额外打包,方便缓存.
├── mix-manifest.json
└── sharebar.chunk.js #提取自组件,动态加载用
之前有点蒙圈,不知道怎么用了,其实配合好mix函数就好,不然为啥用larave-mix呢?mix函数,其实在往manifest.json里写内容:
参数1是告诉blade相对public目录,去找文件;
参数2是告诉相对public到哪里找manifest.json,也就是public/spa
.
{
"/js/app.chunk.js": "/js/app.chunk.js?id=2e268187bbacc5b29dc2",
"/css/app.css": "/css/app.css?id=d41d8cd98f00b204e980",
"/js/manifest.js": "/js/manifest.js?id=3a2343d5990c000f3bea",
"/js/vendor.chunk.js": "/js/vendor.chunk.js?id=4eac5c3b3e61171821dc",
"/sharebar.chunk.js": "/sharebar.chunk.js?id=a5f7808c006d9e0835cb"
}
spa.blade.php,写法1
<script type="text/javascript" src="" ></script>
<script type="text/javascript" src="" ></script>
<script type="text/javascript" src="" ></script>
按上面的写法ok,但是manifest.json没有真正work.
正确写法:
<script type="text/javascript" src="" ></script>
<script type="text/javascript" src="" ></script>
<script type="text/javascript" src="" ></script>
Updated
遇到天坑 ,lazy load无法工作: https://github.com/JeffreyWay/laravel-mix/issues/2064
生成的app.css为空:
爬坑姿势: https://github.com/JeffreyWay/laravel-mix/issues/1914
最终是将webpack.mix.js分为2份,并且通过1个插件合并manifest.json… https://github.com/KABBOUCHI/laravel-mix-merge-manifest