Webpack 入门实战:多入口、CSS分离与异步加载详解
本文详细总结了Webpack在项目中的实际应用,涵盖从基础配置到高级特性的完整流程。内容重点解析了如何配置webpack.config.js实现代码压缩与公共类库提取,通过extract-text-webpack-plugin将CSS单独打包以优化首屏渲染。针对多页面应用,介绍了多入口文件的生成方法。最后,深入讲解了利用require.ensure进行代码切分与按需异步加载,以解决首屏加载臃肿问题,提升页面性能。
近期在项目开发中使用了Webpack,特此对目前掌握的使用技巧进行简要总结。
为什么选择Webpack
为什么选择Webpack
首先,Webpack本身的流行程度是一个重要考量因素。
其次,之前的项目通过RequireJS基于AMD规范进行模块化开发。Webpack不仅支持打包功能,还兼容AMD和CommonJS两种模块化规范,因此决定尝试使用Webpack来实现模块化开发。
此外,项目需求相对简单,适合初学者上手。主要目标包括生成上线目录、实现模块化以及代码压缩等基础功能。
Webpack实战配置
Webpack实战配置
webpack.config.js的标准写法
在配置文件开头,需声明路径相关变量并引入必要的依赖(如Webpack本身,虽非必须但推荐)。接着在entry中定义入口文件的路径和文件名,在output中指定生成文件的路径和名称。module部分用于声明处理不同文件的loader,而plugins部分则配置具体使用的插件。
代码压缩与公共库提取
代码压缩处理
此处使用Webpack内置的压缩插件,配置位于webpack.config.js的plugins字段中。
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
提取公共类库
虽然本项目未直接使用此功能,但这是基于Webpack内置插件的常见做法。其目的是将jQuery等第三方库整合到单独的文件中,避免所有代码合并导致单个文件体积过大。
首先在entry中声明第三方库列表。
entry: {
app: path.resolve(APP_PATH, 'index.js'),
//添加要打包在vendeors里面的库
vendors: ['jquery', 'moment']
},
plugins: {
//把入口文件里面的数组打包成vendors.js
new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js'),
}
CSS单独打包策略
CSS单独打包策略
有时需要将CSS单独打包以便通过CDN分发,或者如本项目情况:页面引入了大量CSS和JS文件,且JS脚本置于页面底部加载。若CSS由JS动态引入,会导致页面初始加载时无样式,直到JS解析执行。因此,将CSS单独打包并在HTML中直接引入是更优方案。
首先需要安装相关插件。
npm install extract-text-webpack-plugin –save-dev
随后在webpack.config.js中声明该插件。
// 引入css 单独打包插件
var ExtractTextPlugin = require("extract-text-webpack-plugin");
// 设置生成css 的路径和文件名,会自动将对应entry入口js文件中引入的CSS抽出成单独的文件
var packCSS = new ExtractTextPlugin('./css/[name].min.css');
在plugins数组中引入并启用该插件。
plugins: [
packCSS
]
需在JS代码中引用相应的CSS文件。
require('./css/plan.css');
该插件会自动提取JS中引入的CSS文件,并生成独立的CSS文件。
样式与图片处理
样式处理配置
安装css-loader和style-loader。
npm install css-loader style-loader --save-dev
css-loader负责遍历CSS文件并处理url(...)引用;style-loader则将所有样式插入到页面的style标签中。
module: {
loaders: [
{
test: /\.css$/,
loaders: ['style', 'css'],
include: APP_PATH
}
]
}
图片资源处理
安装url-loader。
npm install url-loader --save-dev
在webpack.config.js中进行配置。
{
test: /\.(png|jpg)$/,
loader: 'url?limit=8192&name=images/[hash:8].[name].[ext]'
}
通过limit参数设置阈值,小于该值的图片将自动转换为Base64编码,大于该值的图片则打包到name参数指定的路径。图片文件名将包含8位MD5哈希值、原始文件名(name)及扩展名(ext)。
我在图片处理上遇到的问题与CSS类似:原本在JS中引入CSS和图片等静态资源,但由于页面引入了大量CSS和JS文件,且JS文件置于最后加载,导致JS引用的CSS和图片在最后才加载。这会造成页面初始加载时样式丢失,图片显示失败。
原本希望将图片单独打包,但经过搜索和实践,未找到可靠的实现方式。因此,暂时将图片放置在其他公共资源目录中作为权宜之计。
多入口文件生成
一个页面对应一个JS文件
本项目涉及多个页面,需要为每个页面生成对应的独立JS文件。处理方法是将每个JS文件作为独立的入口文件配置在entry中。设置好output中的公共路径后,即可生成对应的多个JS文件。
entry: {
creative: './src/static/js/apps/idea.js',
plan: './src/static/js/apps/plan.js',
},
output: {
path: 'dist/',
filename: 'js/[name].min.js'
}
更新记录
代码切分与异步加载
代码切分与异步加载
今日遇到的问题涉及一个分为四个步骤的页面。每进入下一步,都需要对下一步的内容进行接口请求、页面渲染及事件绑定等操作。
之前的解决方案
在拆分各步骤对应模块后,通过CommonJS方式在入口文件开头引入了各个模块。
此时的配置状态如下。
var stepOne = require('./mods/stepone.js');
var steptwo = require('./mods/steptwo.js');
...
// 使用的时候
stepone.checkOne();
这种做法由于CommonJS的同步加载机制,导致入口文件打包后体积臃肿。首屏加载时,无论是否用到处理代码,所有模块都会一并加载,严重影响了首屏加载速度。
代码切分后的优化
利用Webpack的Code Splitting特性,对各步骤代码进行拆分,实现按需加载。主要利用webpack的require.ensure函数实现。只需将异步加载的代码放入require.ensure的回调函数中即可:
require.ensure(['./mods/stepone.js'], function(){
var stepone = require('./mods/stepone.js');
stepone.checkone();
}, 'stepone'); // 第三个参数设置打包名称
如此配置后,Webpack会单独生成拆分后的文件。还需设置拆分文件的名称和路径,此处经过一番摸索。
Webpack默认使用数字命名拆分文件,若不自行设置,会得到类似1.min.js的文件。可在webpack.config.js中通过output.chunkFilename设置分块生成文件的名称,分块路径通过output.publicPath设置。务必设置publicPath,否则生成的路径可能与上线打包路径不符。具体配置如下:
output: {
path: path.join(__dirname, 'dist'),
filename: 'js/apps/[name].min.js',
publicPath: '/dist/', // 设置require.ensure路径
chunkFilename: 'js/apps/[name].min.js' // 设置require.ensure 文件名
}
总结
Webpack的使用感觉新颖且易于上手。本次总结多为入门内容,后续将继续深入使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
JS处理特殊字符时怎么安全生成JSON
2026-11-05 15:44:51
内部脚本与外部js文件的区别及优缺点对比
2026-11-05 14:42:19
JavaScript前端性能优化指南:提升页面加载速度与渲染效率
2026-11-05 13:48:26
主流JS反混淆工具对比:de4js、unminify与AST还原方案评测
2026-11-05 12:00:56
Nuxt.js 性能优化技巧:代码分割与组件懒加载
2026-11-03 23:32:56








