该文章的webpack配置基于4.x版本。
webpack简介
本质上,webpack 是一个现代 JavaScript 应用程序的_静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个_依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
webpack安装
执行cmd命令安装(淘宝镜像安装 全局安装)
cnpm i webpack webpack-cli -g
npm init
生成package.json文件
打包命令
webpack
默认入口文件 为 src/index.js 默认的输出的文件 是 dist/main.js (该文件压缩过)
如果需要未压缩版的main.js可以执行命令
webpack --mode development
默认是生产环境的 也就是压缩版本的
webpack --mode production
//等价于
webpack
webpack.config.js的配置
wepack四个核心概念
- 入口(entry) 入口的文件的配置处
- 输出(output) 输出的文件的配置处
- loader: loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块
- 插件(plugins) 使用插件可以更有效打包优化和压缩。
webpack.config.js的基本配置
//webpack.config.js
const path=require('path');
//遵循common.js规范
module.exports={
//指定入口文件
entry:'./src/index.js',
//输出文件的配置
output:{
//指定输出文件的目录路径
path: path.resolve(__dirname,'public'),
//指定输出文件的文件名
filename: 'bundle.js'
}
}
再执行 webpack
打包命令,生成 bundle.js
配置webpack-dev-server服务器
- 安装dev-server
cnpm i webpack-dev-server -S
- package.json配置
{
"name": "demo1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --open --inline" //配置服务器
},
"author": "",
"license": "ISC",
"dependencies": {
"webpack-dev-server": "^3.10.3"
}
}
- webpack.config.js
//webpack.config.js
const path=require('path');
//遵循common.js规范
module.exports={
//指定入口文件
entry:'./src/index.js',
devServer:{
contentBase:'./public',//根目录
port:8888, //端口号
},
//输出文件的配置
output:{
//指定输出文件的目录路径
path: path.resolve(__dirname,'public'),
//指定输出文件的文件名
filename: 'bundle.js'
}
}
配置css-loader和file-loader
loader:加载程序
要读取style.css 需要安装 style-loader 和css-loader
针对文件路径 ,需要安装 file-loader
cnpm i style-loader css-loader -S
cnpm i file-loader -S
配置代码
//webpack.config.js
const path=require('path');
//遵循common.js规范
module.exports={
//指定入口文件
entry:'./src/index.js',
devServer:{
contentBase:'./public',//根目录
port:8888, //端口号
},
//该模块用于存放loader配置项
module:{
//规则
rules:[
//每一个loader配置项
{
test:/\.css$/,
use: ['style-loader','css-loader']
},
{
test:/\.(jpg|png|jpeg)$/,
use:['file-loader']
}
]
},
//输出文件的配置
output:{
//指定输出文件的目录路径
path: path.resolve(__dirname,'public'),
//指定输出文件的文件名
filename: 'bundle.js'
}
}
背景图能正常显示
webpack插件
使用html-webpack-plugin插件 ,该插件就是为了保证src目录和public目录生成的文件一致
首先是安装
cnpm i html-webpack-plugin -S
配置代码
//webpack.config.js
const path=require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');
//遵循common.js规范
module.exports={
//指定入口文件
entry:'./src/index.js',
devServer:{
contentBase:'./public',//根目录
port:8888, //端口号
},
//该模块用于存放loader配置项
module:{
//规则
rules:[
//每一个loader配置项
{
test:/\.css$/,
use: ['style-loader','css-loader']
},
{
test:/\.(jpg|png|jpeg)$/,
use:['file-loader']
}
]
},
mode:'production',
//插件存放区域
plugins:[
new HtmlWebpackPlugin({
template:"./src/index.html",
minify:{
//去除引号
removeAttributeQuotes:true,
//去除注释
removeComments:true,
//去除空属性
removeEmptyAttributes:true,
//去除空格
removeTagWhitespace:true
}
})
],
//输出文件的配置
output:{
//指定输出文件的目录路径
path: path.resolve(__dirname,'public'),
//指定输出文件的文件名
filename: 'bundle-[hash].js'
}
}
处理html中的img标记的图片路径问题
使用html-withimg-loader
安装
cnpm i html-withimg-loader -S
配置代码
//webpack.config.js
const path=require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');
//遵循common.js规范
module.exports={
//指定入口文件
entry:'./src/index.js',
devServer:{
contentBase:'./public',//根目录
port:8888, //端口号
},
//该模块用于存放loader配置项
module:{
//规则
rules:[
//每一个loader配置项
{
test:/\.css$/,
use: ['style-loader','css-loader']
},
{
test:/\.(jpg|png|jpeg)$/,
use:[
{
loader:'file-loader',
options:{
//去除图片路径上default对象
esModule:false
}
}
]
},
{
test:/\.(htm|html)$/i,
loader:'html-withimg-loader'
},
]
},
mode:'production',
//插件存放区域
plugins:[
new HtmlWebpackPlugin({
template:"./src/index.html",
minify:{
//去除引号
removeAttributeQuotes:true,
//去除注释
removeComments:true,
//去除空属性
removeEmptyAttributes:true,
//去除空格
removeTagWhitespace:true
}
})
],
//输出文件的配置
output:{
//指定输出文件的目录路径
path: path.resolve(__dirname,'public'),
//指定输出文件的文件名
filename: 'bundle-[hash].js'
}
}
图片正常显示
字体图标的引入
//webpack.config.js
const path=require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');
//遵循common.js规范
module.exports={
//指定入口文件
entry:'./src/js/index.js',
devServer:{
contentBase:'./public',//根目录
port:8888, //端口号
},
//该模块用于存放loader配置项
module:{
//规则
rules:[
//每一个loader配置项
{
test:/\.css$/,
use: ['style-loader','css-loader']
},
{
test:/\.(jpg|png|jpeg)$/,
use:[
{
loader:'file-loader',
options:{
//去除图片路径上default对象
esModule:false,
//设置文件路径
name:'./img/[hash].[ext]'
}
}
]
},
{
//img路径
test:/\.(htm|html)$/i,
loader:'html-withimg-loader'
},
{
//字体图标
test:/\.(woff|ttf|svg|eot|xttf|woff2)$/,
use:[
{
loader:'file-loader',
options:{
name:'./fonts/[name].[ext]'
}
}
]
}
]
},
mode:'production',
//插件存放区域
plugins:[
new HtmlWebpackPlugin({
template:"./src/index.html",
minify:{
//去除引号
removeAttributeQuotes:true,
//去除注释
removeComments:true,
//去除空属性
removeEmptyAttributes:true,
//去除空格
removeTagWhitespace:true
}
})
],
//输出文件的配置
output:{
//指定输出文件的目录路径
path: path.resolve(__dirname,'public'),
//指定输出文件的文件名
filename: 'js/bundle-[hash].js'
}
}
提取分离css
插件安装
cnpm i extract-text-webpack-plugin@next -S
配置代码
//webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
//遵循common.js规范
module.exports = {
//指定入口文件
entry: './src/js/index.js',
devServer: {
contentBase: './public', //根目录
port: 8888, //端口号
},
//该模块用于存放loader配置项
module: {
//规则
rules: [
//每一个loader配置项
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use:[{
loader: "css-loader",
options:{
}
}],
publicPath:'../'
})
},
{
test: /\.(jpg|png|jpeg)$/,
use: [{
loader: 'file-loader',
options: {
//去除图片路径上default对象
esModule: false,
//设置文件路径
name: './img/[hash].[ext]'
}
}]
},
{
//img路径
test: /\.(htm|html)$/i,
loader: 'html-withimg-loader'
},
{
//字体格式
test: /\.(woff|ttf|svg|eot|xttf|woff2)$/,
use: [{
loader: 'file-loader',
options: {
name: './fonts/[name].[ext]'
}
}]
}
]
},
mode: 'production',
//插件存放区域
plugins: [
//提取分离css插件
new ExtractTextPlugin('./css/[name].css'),
new HtmlWebpackPlugin({
template: "./src/index.html",
minify: {
//去除引号
removeAttributeQuotes: true,
//去除注释
removeComments: true,
//去除空属性
removeEmptyAttributes: true,
//去除空格
removeTagWhitespace: true
}
})
],
//输出文件的配置
output: {
//指定输出文件的目录路径
path: path.resolve(__dirname, 'public'),
//指定输出文件的文件名
filename: 'js/bundle-[hash].js'
}
}
如图
压缩
webpack.optimize.UglifyJsPlugin
babel配置 (解析es6的语法)
核心: babel-core
功能: babel-loader babel-preset-env babel-preset-react
安装 -D表示开发依赖
cnpm i @babel/core babel-loader @babel/plugin-transform-runtime -D
cnpm i @babel/preset-env -D
cnpm i @babel/preset-react -D
cnpm i @babel/plugin-proposal-class-properties -D
.babelrc的配置
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
],
"plugins": [
"@babel/plugin-transform-runtime",
"@babel/plugin-proposal-class-properties"
]
}
//webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
//遵循common.js规范
module.exports = {
//指定入口文件
entry: './src/js/index.js',
devServer: {
contentBase: './public', //根目录
port: 8888, //端口号
},
//该模块用于存放loader配置项
module: {
//规则
rules: [
//每一个loader配置项
{
test:/\.(jsx|js)$/,
use:{
loader:"babel-loader",
// options:{
// presets: ["@babel/preset-env", "@babel/preset-react"]
// }
},
exclude: /node_modules/
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use:[{
loader: "css-loader",
options:{
}
}],
publicPath:'../'
})
},
{
test: /\.(jpg|png|jpeg)$/,
use: [{
loader: 'file-loader',
options: {
//去除图片路径上default对象
esModule: false,
//设置文件路径
name: './img/[hash].[ext]'
}
}]
},
{
//img路径
test: /\.(htm|html)$/i,
loader: 'html-withimg-loader'
},
{
//字体格式
test: /\.(woff|ttf|svg|eot|xttf|woff2)$/,
use: [{
loader: 'file-loader',
options: {
name: './fonts/[name].[ext]'
}
}]
}
]
},
mode: 'development',
//插件存放区域
plugins: [
//提取分离css插件
new ExtractTextPlugin('./css/[name].css'),
new HtmlWebpackPlugin({
template: "./src/index.html",
minify: {
//去除引号
removeAttributeQuotes: true,
//去除注释
removeComments: true,
//去除空属性
removeEmptyAttributes: true,
//去除空格
removeTagWhitespace: true
}
})
],
//输出文件的配置
output: {
//指定输出文件的目录路径
path: path.resolve(__dirname, 'public'),
//指定输出文件的文件名
filename: 'js/bundle-[hash].js'
}
}
引入第三方库,类似jquery
安装
cnpm i jquery -S
引入
效果图