项目基于angular2框架,引用了metronicUI框架,大量的第三方js插件引入导致webpack打包js文件一直报各种奇奇怪怪的错。前期由于开发时间有限一直将就着只是打包css,后来项目一期上线实在是受不了首屏加载的龟速,于是下定决心要解决这个问题,于是开始深挖webpack的配置。
下面记录一下有关问题:
问题一:采用url-loader区分大小图片文件,大于8k的打包成图片,小于8k转为base64储存,减少打包后的图片资源。但是这里有一个问题就是图片引入路径格式不正确的话webpack不能提取图片并转化。一开始是在ts文件中声明变量然后把图片的url作为字符串赋值之,html中直接用<img src='xxx/xx.png'/>的方式引入,发现页面刷新这样引入的小图片都不见了,最后研究很久发现webpack在图片引入时找不到可以强行把路径写成require('xxx/xx.png'),方式如下:
// ts中
linePattern: Array<any> = [{
value: [10, 0],
name: '实线',
url: require('../../../../../src/assets/img/toolbar/changeLinkPattern.png')
}, {
value: [2, 2],
name: '虚线1',
url: require('../../../../../src/assets/img/toolbar/dash1changeLinkPattern.png')
}, {
value: [4, 4],
name: '虚线2',
url: require('../../../../../src/assets/img/toolbar/dash2changeLinkPattern.png')
}, {
value: [6, 6],
name: '虚线3',
url: require('../../../../../src/assets/img/toolbar/dash3changeLinkPattern.png')
}, {
value: [8, 8],
name: '虚线4',
url: require('../../../../../src/assets/img/toolbar/dash4changeLinkPattern.png')
}, {
value: [10, 10],
name: '虚线5',
url: require('../../../../../src/assets/img/toolbar/dash5changeLinkPattern.png')
}
]
// 在html中只需这样即可
<img style="width:25px" [src]="lineS.url" />
这样打包出来的这些小图片就变成了base64不会找不到啦。
问题二:项目中引入的第三方js插件需要声明全局变量的话打包不会出问题但是打完包页面找不到,比如提示框toastr,就是这个问题。后来在webpack中使用alias定义别名toastr,然后在插件中使用provideplugin把toastr直接引入而不需要再通过import或者require。
alias: {
'toastr': helpers.root('src', 'assets/global/plugins/bootstrap-toastr/toastr.min.js')
}
new webpack.ProvidePlugin({
toastr: "toastr"
}),
问题三:发现一个以前都没注意的问题,bootstrap只能用jquery1.xx-2.xx的版本,3.00以上的jquery浏览器会报错。。