#webpack package
##如何运行demo 1、首次运行 npm i //安装npm包
npm run webpack:dll //编译固定第三方插件
npm run dev //使用webpack-dev-server 运行
2、后续运行 如果只修改了业务代码
npm run dev
如果引用了第三方
npm run webpack:dll //编译固定第三方插件
npm run dev //使用webpack-dev-server 运行
##basic knowledge ###entry —— 入口文件配置 1、单入口 entry:"***.js";
2、多入口 entry:{name1:".js",name2:'.js',...},建议使用这种写法,方便扩展
###output —— 输出文件 output:{
path:'string',//生成文件的根目录
filename:'',//可以是固定的文件名 或者[name].[hash].js
}
参考: https://segmentfault.com/a/1190000006863968
##打包输出模板文件 1、install loader “angular2-template-loader html-loader”. '.ts' loader change to "loaders: ['awesome-typescript-loader', 'angular2-template-loader']"
2、use html-loader instead of raw loader .If you do not instead,it will be ok,but html file can not be compressed
1、install "raw-loader"
2、webpack config file add loader { test:'/.css$/',loader:'raw',include:'styleUrls file path' }
1、install “css-loader style-loader”
2、webpack config file add loader { test:'/.css$/',loaders: ['style-loader', 'css-loader'],include:'other css file path' }
注:include,exclude 目的是为了选择需要打包 的css文件所在的目录
use Extract-text-webpack-plugin. link: http://npm.taobao.org/package/extract-text-webpack-plugin
warning: loaders and plugin 要一起使用才会生效
1、use webpack.optimize.UglifyJsPlugin() compress js file
1、use webpack.ProviderPlugin.
eg.
npm i --save jquery ;
import 'jquery';
new webpack.ProviderPlugin({
jQuery:'jquery',
$:'jquery',
'window.$':'jquery',
'window.jQuery':'jquery'
})
2、use expose-loader . https://github.com/webpack/expose-loader
eg.
npm i --save jquery ;
import 'jquery';
{test:require.resolve('jquery'),loader:'expose-loader?$!expose-loader?jQuery'}
use webpack config options —— externals
eg. externals:{ 'jquery':'window.jQuery'} ;然后可以调用 var $=require(jquery);
use bebel
npm i --save-dev babel-core babel-preset-es2015-loose
更优化方案:设置cacheDirectory、加载plugin(npm i --save-dev bable-runtime babel-plugin-transforn-runtime )
{test:/.js$/,loader: 'babel-loader?presets[]=es2015-loose&cacheDirectory&plugins[]=transform-runtime'}
https://segmentfault.com/a/1190000006992218
use eslint-loader
https://github.com/MoOx/eslint-loader
npm i --save-dev html-webpack-plugin
{
new HtmlWebpackPlugin({
title:'',
filename:'生成的网页HTML文件的文件名',
template:'模板文件',
inject:'js插入的位置,默认为body末尾',
minify:'生成压缩后的html代码',
hash:'inject进入html页面的添加hash值,属于缓存解决方案,和output的name用[hash]一个效果',
chunks:'以数组的形式指定由html-webpack-plugin负责加载的chunk文件(打包后生成的js文件),不指定的话就会加载所有的chunk。'
})
}
用webpack.DefinePlugin 配置node的全局进程process的env(进程的环境变量),再在业务代码里面做出对应的判断
new webpack.DefinePlugin({'process.env': JSON.stringify(true)})
if (process.env) { // 做生产环境该做的事} else { // 做开发环境该做的事}
new webpack.optimize.CommonChunkPlugin({
name:'',//这是公共代码的Chunk的名字
filename:'***',//可以固定文件名或者 [name].js(name是上面配置的属性)
minChunks:'number'//被重复加载的次数才纳入公共代码
})
原理:第三方库使用 webpack 的DllPlugin单独打包,然后打包业务代码并用DllReferencePlugin关联第三方库
操作:1、单独新建一个DllPlugin的config文件,配置对应的output、entry、plugins,然后运行webpack打包此config文件
2、webpack打包业务代码
注意:需要先运行DllPlugin生产manifest.json,然后再打包业务代码
问题:打包了第三方库的时候打包了vendors.ts、polyfills.ts,但是在业务代码里面还要在entry里面添加,否则会报错,why???