一、Webpack基本概念
Webpack是一个现代JavaScript应用静态模块打包器。当运行Webpack时,它会读取配置文件,分析项目中的所有模块依赖关系,然后将这些模块打包成一个或多个bundle。
1.1 入口(Entry)
入口是Webpack构建的开始,它指定了Webpack应该使用哪个模块作为项目的入口点。
module.exports = {
entry: './src/main.js',
};
1.2 出口(Output)
输出是Webpack处理完模块后生成的文件,它告诉Webpack将输出到哪个目录以及输出文件的名字。
module.exports = {
output: {
path: __dirname + '/dist',
filename: 'bundle.js',
},
};
1.3 插件(Plugins)
插件是Webpack的扩展,它允许我们添加自定义功能到Webpack构建流程中。
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
],
};
1.4 负载(Loaders)
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
};
二、CSS优化技巧
在Vue项目中,CSS优化主要通过以下几种方式实现:
2.1 使用PostCSS
PostCSS是一个使用JavaScript插件转换CSS的工具。通过安装和配置PostCSS,我们可以实现以下优化:
- 自动添加浏览器前缀:使用
autoprefixer
插件自动添加浏览器前缀。 - 代码压缩:使用
cssnano
插件压缩CSS代码。
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 1,
},
},
'postcss-loader',
],
},
],
},
plugins: [
new PostcssPlugin({
plugins: [require('autoprefixer'), require('cssnano')],
}),
],
};
2.2 使用CSS Modules
CSS Modules是一种在CSS中模块化的方式,它可以避免全局污染,提高CSS代码的复用性。
<style module>
.example {
color: red;
}
</style>
三、图片优化技巧
3.1 使用Image Minimizer Plugin
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 1024,
name: 'img/[name].[hash:7].[ext]',
},
},
{
loader: 'image-minimizer-webpack-plugin',
options: {
minimizerOptions: {
plugins: [
['gifsicle', { interlaced: true }],
['jpegtran', { progressive: true }],
['optipng', { optimizationLevel: 5 }],
['svgo', {}],
],
},
},
},
],
},
],
},
};
3.2 使用Webpack Inline-Chunk Plugin
const InlineChunkManifestPlugin = require('webpack-inline-chunk-manifest-plugin');
module.exports = {
module: {
rules: [
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 1024,
name: 'img/[name].[hash:7].[ext]',
esModule: false,
},
},
],
},
],
},
plugins: [
new InlineChunkManifestPlugin(),
],
};