webapck是什么?学习重点:在于配置和使用(工具)
前端代码为何要进行构建和打包? | 代码层面 :
- 体积更小(Tree-Shaking、压缩、合并, 加载更快
- 编译高级语言或语法(TS、ES6+、模块化、scss)
- 兼容性和错误检查(Polyfill、postcss、eslint)
| 研发流程:
- 高效的开发环境
- 统一的构构建流程和产出标准
- 集成公司构建规范(提测、上线)
| | —- | —- |module、chunk、bundle 分别什么意思, 有何区别?
3. loader和plugin的区别?
4. webpack 如何实现懒加载?
5. webpack 常⻅性能优化?
6. babel-runtime和babel-polyfill的区别?
webpack使用优化
1. 使用别名。 alise
resolve: {
alias: {
'@views': path.resolve(__dirname, 'src/views'),
moment: 'moment/min/moment-width-locales.min.js'
}
}
2. 忽略对已知模块解析。noParse 实践??
过滤不需要解析的文件,比如打包的时候依赖了三方库(jquyer、lodash)等,而这些三方库里面没有其他依赖,可以通过配置noParse不去解析文件,提高打包效率RegExp
[RegExp]|``function(resource)
| string
[string]
module: {
noParse: [/moment-with-locales/],
noParse: /jquery|lodash/,
noParse: (content) => /jquery|lodash/.test(content)
}
3. 将模块暴露到全局,expose-loader、ProvidePlugin
3.1 expose-loader
yarn add expose-loader --dev
module: {
loaders: [
{ test: require.resolve("jquery"), loader: "expose-loader?$" }
]
}
// window.$ is then available in the browser console
require("expose-loader?$!jquery");
3.2 ProvidePlugin
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
});
]
// $ is automatically set to the exports of module "jquery"
$('#item')
4. 提取公共代码。webpack.optimize.CommonsChunkPlugin
entry: {
vendor: ['jquery', 'other-lib'],
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'commons',
// (公共 chunk(commnon chunk) 的名称)
filename: 'commons.js',
// (公共chunk 的文件名)
// minChunks: 3,
// (模块必须被3个 入口chunk 共享)
// chunks: ["pageA", "pageB"],
// (只使用这些 入口chunk)
}),
// 明确第三方chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
// filename: "vendor.js"
filename: "[name].[hash:8].js"
// (给 chunk 一个不同的名字)
minChunks: 3,
// (随着 entry chunk 越来越多,
// 这个配置保证没其它的模块会打包进 vendor chunk)
chunks: ['jquery', 'lodash']
})
]
5. 配置全局开关 webpack.DefinePlugin
plugins: [
new webpack.DefinePlugin({
// Definitions...
DEBUG: true
});
]
const Constant = {
API_HOST: DEBUG ? "http://192.169.2.187" : ""
}
6. 单独打包CSS
yarn add extract-text-webpack-plugin --dev
const ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
},
plugins: [
new ExtractTextPlugin("styles.css"),
]
}
参考文献:
Webpack性能优化
css单独打包