详解webpack进阶之插件篇
发布时间 - 2026-01-11 02:12:57 点击率:次一、插件篇

1. 自动补全css3前缀
autoprefixer
官方是这样说的:Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website,也就是说它是一个自动检测兼容性给各个浏览器加个内核前缀的插件。
举个栗子:最新的弹性盒模型flux
实际代码:
:fullscreen a {
display: flex
}
插件自动补充后
a {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex
}
效果显而易见,我们可以更专注于css布局和美化,而不需要花过多的精力都写相同的外码而加上不同的前缀,也减少了冗余代码。
使用方法:
cnpm install --save-dev autoprefixer postcss-loader
var autoprefixer = require('autoprefixer');
module.exports={
//其他配置这里就不写了
module:{
loaders:[
{
test:/\.css$/,
//在原有基础上加上一个postcss的loader就可以了
loaders:['style-loader','css-loader','postcss-loader']
}
]
},
postcss:[autoprefixer({browsers:['last 2 versions']})]
}
2. 自动生成html插件
html-webpack-plugin
cnpm install html-webpack-plugin --save-dev
//webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports={
entry:'./index.js',
output:{
path:__dirname+'/dist',
filename:'bundle.js'
}
plugins:[
new HtmlWebpackPlugin()
]
}
作用:它会在dist目录下自动生成一个index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Webpack App</title> </head> <body> <script src="bundle.js"></script> </body> </html>
其他配置参数:
{
entry: 'index.js',
output: {
path: 'dist',
filename: 'bundle.js'
},
plugins: [
new HtmlWebpackPlugin({
title: 'My App',
filename: 'admin.html',
template:'header.html',
inject: 'body',
favicon:'./images/favico.ico',
minify:true,
hash:true,
cache:false,
showErrors:false,
"chunks": {
"head": {
"entry": "assets/head_bundle.js",
"css": [ "main.css" ]
},
xhtml:false
})
]
}
--- header.html --- <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title><%= htmlWebpackPlugin.options.title %></title> </head> <body> </body> </html>
作用:
- title: 设置title的名字
- filename: 设置这个html的文件名
- template:要使用的模块的路径
- inject: 把模板注入到哪个标签后 'body',
- favicon: 给html添加一个favicon './images/favico.ico',
- minify:是否压缩 {...} | false (最新api变动,原来是ture|false 感谢@onmi指正)
- hash:是否hash化 true false ,
- cache:是否缓存,
- showErrors:是否显示错误,
- chunks:目前没太明白
- xhtml:是否自动毕业标签 默认false
3. 提取样式插件
extract-text-webpack-plugin
官网是这么解释的Extract text from bundle into a file.,把额外的数据加到编译好的文件中
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
module: {
loaders: [
{ test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") }
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/public/index.html',
inject: 'body'
}),
new ExtractTextPlugin("[name].[hash].css")
]
}
说明:将css放到index.html的body上面
4. 拷贝资源插件
copy-webpack-plugin
官方这样解释 Copy files and directories in webpack,在webpack中拷贝文件和文件夹
cnpm install --save-dev copy-webpack-plugin
new CopyWebpackPlugin([{
from: __dirname + '/src/public'
}]),
作用:把public 里面的内容全部拷贝到编译目录
| 参数 | 作用 | 其他说明 |
|---|---|---|
| from | 定义要拷贝的源目录 | from: __dirname + '/src/public' |
| to | 定义要烤盘膛的目标目录 | from: __dirname + '/dist' |
| toType | file 或者 dir | 可选,默认是文件 |
| force | 强制覆盖先前的插件 | 可选 默认false |
| context | 不知道作用 | 可选 默认 base context 可用 specific context |
| flatten | 只拷贝文件不管文件夹 | 默认是false |
| ignore | 忽略拷贝指定的文件 | 可以用模糊匹配 |
5. 全局挂载插件
webpack.ProvidePlugin [webpack内置插件 ]
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
}))
new webpack.NoErrorsPlugin(),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.CommonsChunkPlugin('common.js')
作用: 和上面5个一一对应
- 当模块使用这些变量的时候,wepback会自动加载。(区别于window挂载,感谢@lihuanghe121指正)
- 不显示错误插件
- 查找相等或近似的模块,避免在最终生成的文件中出现重复的模块
- 丑化js 混淆代码而用
- 提取公共代码的插件
二、一个完整的栗子
'use strict';
// Modules
var webpack = require('webpack');
var autoprefixer = require('autoprefixer');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var CopyWebpackPlugin = require('copy-webpack-plugin');
/**
* Env
* Get npm lifecycle event to identify the environment
*/
var ENV = process.env.npm_lifecycle_event;
var isTest = ENV === 'test' || ENV === 'test-watch';
var isProd = ENV === 'build';
module.exports = function makeWebpackConfig() {
var config = {};
config.entry = isTest ? {} : {
app: './src/app/app.js'
};
config.output = isTest ? {} : {
// Absolute output directory
path: __dirname + '/dist',
publicPath: isProd ? '/' : 'http://localhost:8080/',
filename: isProd ? '[name].[hash].js' : '[name].bundle.js',
chunkFilename: isProd ? '[name].[hash].js' : '[name].bundle.js'
};
if (isTest) {
config.devtool = 'inline-source-map';
} else if (isProd) {
config.devtool = 'source-map';
} else {
config.devtool = 'eval-source-map';
}
config.module = {
preLoaders: [],
loaders: [{
test: /\.js$/,
loader: 'babel',
exclude: /node_modules/
}, {
test: /\.css/,
loader: isTest ? 'null' : ExtractTextPlugin.extract('style', 'css?sourceMap!postcss')
}, {
test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,
loader: 'file'
}, {
test: /\.json$/,
loader: 'json'
}, {
test: /\.scss/,
loader: 'style!css!sass'
}, {
test: /\.html$/,
loader: 'raw'
}]
};
if (isTest) {
config.module.preLoaders.push({
test: /\.js$/,
exclude: [
/node_modules/,
/\.spec\.js$/
],
loader: 'isparta-instrumenter'
})
}
config.postcss = [
autoprefixer({
browsers: ['last 2 version']
})
];
config.plugins = [];
if (!isTest) {
config.plugins.push(
new HtmlWebpackPlugin({
template: './src/public/index.html',
inject: 'body'
}),
new ExtractTextPlugin('[name].[hash].css', {disable: !isProd})
)
}
if (isProd) {
config.plugins.push(
new webpack.NoErrorsPlugin(),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new CopyWebpackPlugin([{
from: __dirname + '/src/public'
}]),
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
}))
}
config.devServer = {
contentBase: './src/public',
stats: 'minimal'
};
return config;
}();
三、调试技巧
if (isTest) {
config.devtool = 'inline-source-map';
}
作用: 使用source-map可以在debug的时候看到源代码,方便 查错
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# webpack
# 插件开发
# 插件
# webpack插件
# Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
# Webpack+Vue如何导入Jquery和Jquery的第三方插件
# 基于vuejs+webpack的日期选择插件
# 可选
# 自动生成
# 是这样
# 就不
# 可以用
# 会在
# 它是
# 我们可以
# 写了
# 显而易见
# 要使
# 要花
# 官网
# 源代码
# 大家多多
# 上加
# 举个
# 就可以
# 先前
# 而用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
利用JavaScript实现拖拽改变元素大小
Laravel如何实现文件上传和存储?(本地与S3配置)
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
详解阿里云nginx服务器多站点的配置
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
怎么用AI帮你设计一套个性化的手机App图标?
Bootstrap整体框架之JavaScript插件架构
如何快速搭建高效WAP手机网站吸引移动用户?
Laravel如何实现本地化和多语言支持?(i18n教程)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何为不同团队 ID 动态生成多个“认领值班”按钮
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
详解CentOS6.5 安装 MySQL5.1.71的方法
Python正则表达式进阶教程_复杂匹配与分组替换解析
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
南京网站制作费用,南京远驱官方网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
javascript基于原型链的继承及call和apply函数用法分析
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
python中快速进行多个字符替换的方法小结
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
进行网站优化必须要坚持的四大原则
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
详解Android中Activity的四大启动模式实验简述
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
浅谈redis在项目中的应用
如何在万网开始建站?分步指南解析
网站图片在线制作软件,怎么在图片上做链接?
如何在IIS中新建站点并解决端口绑定冲突?
如何在阿里云虚拟服务器快速搭建网站?
如何获取PHP WAP自助建站系统源码?
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何优化应用性能?(缓存和优化命令)
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
千库网官网入口推荐 千库网设计创意平台入口
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
在centOS 7安装mysql 5.7的详细教程

