Webpack打包工具对项目中的复杂文件进行打包处理,可以实现项目的自动化构建,并且给前端开发人员带来了极大的便利。
目前,企业中的绝大多数前端项目是基于Webpack打包工具来进行开发的。
使用npm包管理工具安装webpack和webpack-cli两个模块。
npm install webpack webpack-cli -D
目录下新建webpack.config.js
文件
// 使用module.exports方式导出配置对象。
// mode用来指定构建模式
module.exports = {
mode: 'development'
};
// package.json
// 设置dev为webpack
// 表示当我们使用npm run dev命令时
// 就可以执行script节点下dev选项的脚本来启动Webpack对项目进行打包处理。
"dev": "webpack"
在Webpack的4.x版本中,默认约定entry打包的入口文件为src下的index.js;output打包的输出文件为dist下的main.js。
配置Webpack默认入口和出口文件配置是通过手动设置webpack.config.js文件中的配置对象的entry和output属性来定义新的入口和出口文件。
// webpack.config.js
// 导入操作文件路径的模块
const path = require('path');
module.exports = {
mode: 'development',
// 打包入口文件的路径
entry: path.join(__dirname, './src/index.js'),
output: {
path: path.join(__dirname, './dist'), // 输出文件的存放路径
filename: 'bundle.js' // 输出文件的名称
}
};
利用Webpack中jQuery插件来实现列表隔行换色的页面效果。
npm install jquery -S
$.css()
方法实现页面效果// index.js
// 使用ES6模块化语法导入jquery插件
import $ from 'jquery';
$(function() {
$('li:odd').css('backgroundColor', 'lightgreen');
$('li:even').css('backgroundColor', 'lightblue');
});
webpack-dev-server
可以支持项目自动打包的工具,可以启动一个实时打包的HTTP服务器,使用webpack-dev-server来实现项目的自动打包功能。
webpack-dev-server
插件
npm install webpack-dev-server -D
package.json
中scripts
选项中的dev命令
"dev": "webpack-dev-server"
bundle.js
npm run dev
index.html
文件中引入bundle.js
localhost:8080/bundle.js
可以访问到代码。html-webpack-plugin插件用来生成预览的页面。
html-webpack-plugin
插件
npm install html-webpack-plugin -D
HtmlWebpackPlugin()
html-webpack-plugin
插件// webpack.config.js
// 导入生成预览页面的插件,得到一个构造函数
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 创建插件的实例对象
const htmlPlugin = new HtmlWebpackPlugin({
// 指定要用到的模板文件
template: './src/index.html',
// 指定生成的文件的名称,该文件存在于内存中,在目录中不显示
filename: 'index.html'
});
// plugins数组是webpack打包期间会用到的一些插件列表
module.exports = {
// 原代码
plugins: [ htmlPlugin ]
};
// package.json
// 修改scripts选项中的dev命令
// --open参数用来实现打包完成后自动打开浏览器页面功能
// --host参数用来配置IP地址127.0.0.1
// --port参数用来配置端口号3000。
"dev": "webpack-dev-server --open --host 127.0.0.1 --port 3000"
在默认的情况下,Webpack能打包处理一些以.js后缀名结尾的简单模块,而其他非.js后缀名结尾的复杂模块是不能打包处理的,需要通过调用特定的加载器来打包处理相应文件模块,否则会报错。
常用加载器:
在Webpack中,同时使用css-loader和style-loader加载器来打包处理CSS文件。
li {list-style: none;}
import './css/index.css';
npm install style-loader css-loader -D
npm run dev
命令重新启动服务器“/\.css$/”
表示匹配文件名后缀为.css的文件;use表示调用对应的loader加载器。module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
]
}
Sass(Syntactically Awesome Stylesheets)是一个成熟、稳定、功能强大的专业级CSS扩展语言。使用Sass语言以及Sass的样式库(如 Compass)有助于更好地组织管理样式文件,并更高效地开发项目。
在Webpack中,sass-loader加载器可以用来打包处理Sass文件。
ul {font-size: 12px; li{line-height: 30px;}}
npm install sass-loader node-sass -D
{test: /\.scss$/,use: ['style-loader', 'css-loader', 'sass-loader']},
“/\.scss$/”
表示匹配文件名后缀为.scss的文件;use中的sass-loader首先被调用处理匹配到的Sass文件,然后将返回结果依次向前传递,直到结束。import './css/index.scss';
npm run dev
命令重新启动服务器Less(Leaner Style Sheets)是一门CSS扩展语言,也称为CSS预处理器。作为CSS的一种形式的扩展,它并没有减少CSS的功能,而是在现有的CSS语法上,为CSS加入程序式语言的特性。
在Webpack中可以使用less-loader加载器来打包处理Less文件。
body {margin: 0;padding: 0; ul {padding: 0;margin: 0;}}
npm install less-loader less -D
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader']},
“/\.less$/”
表示匹配文件名后缀为.less的文件,less-loader加载器用来处理匹配到的.less文件import './css/index.less';
npm run dev
命令重新启动服务器PostCSS是一个用JavaScript工具和插件转换CSS代码的工具,类似于Babel对JavaScript的处理。
PostCSS的功能如下:
autoprefixer
是一个后处理程序(插件),它经常与postcss-loader
加载器一起配合使用,会自动为普通的CSS添加浏览器前缀,并且支持W3C最新的规范。
::placeholder{color: red;}
::placeholder
选择器用来选择一个表单元素的占位文本postcss-loader
加载器和autoprefixer
插件
npm install postcss-loader autoprefixer -D
postcss-loader
和autoprefixer
可以自动添加CSS的浏览器兼容性前缀autoprefixer
插件,配置插件autoprefixer
插件
postcss.config.js
文件,编写JavaScript代码autoprefixer
插件const autoprefixer = require('autoprefixer'); // 导入自动添加前缀的插件
module.exports = {
plugins: [ autoprefixer ] // 挂载插件
};
webpack.config.js
文件,编写代码{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader']},
postcss-loader
加载器用来自动为普通的CSS添加浏览器前缀npm run dev
命令重新启动服务器url-loader加载器用来打包处理CSS中与URL路径地址相关的图片和字体文件,并将图片和字体文件转换成为base64图片形式。
#box{width: 580px;height: 340px;background: url('../images/1.jpg');}
url-loader
规则
url-loader
和file-loader
加载器npm install url-loader file-loader -D
url-loader
和file-loader
能处理图片和字体文件webpack.config.js
文件,编写代码{test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,use: 'url-loader?limit=16940'},
npm run dev
命令重新启动服务器项目开发过程中,当编写JavaScript代码时,有时候会使用JavaScript高级语法,这些高级语法存在兼容性的问题。我们可以使用babel-loader加载器对JavaScript高级语法进行打包处理,如class语法。
class Person {static name = '张三'};console.log(Person.name);
babel-loader
加载器和插件babel-loader
、 @babel/core
等插件npm install babel-loader @babel/core @babel/runtime -D
npm install @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D
@babel/preset-env
智能预设module.exports = {
presets: [ '@babel/preset-env' ],
plugins: [ '@babel/plugin-transform-runtime', '@babel/plugin-proposal-class-properties' ]
};
{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/},
“/\.js$/”
表示匹配文件名后缀为.js的文件,设置exclude属性的值为“/node_modules/”,表示babel-loader加载器不需要处理node_modules中的JavaScript文件。npm run dev
命令重新启动服务器bundle.js