Learning webpack
安装webpack
npm init -y//建立默认手脚架
npm install webpack webpack-cli --save-dev
Demo
1.在根目录建立两个文件夹(src文件夹和dist文件夹)
src文件夹:用来存放javascript代码,可以简单的理解为用JavaScript编写的模块。
dist文件夹:用来存放供浏览器读取的文件,这个是webpack打包成的文件。
2.编写程序文件
(1)在dist文件下手动建立一个index.html文件(/dist/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>webpack</title>
</head>
<body>
<div id="title"></div>
<script src="./main.js"></script>
</body>
</html>
(2)在src文件夹下建立entery.js的文件用于编写JavaScript代码,也是入口文件(src/index.js)
document.getElementById('title').innerHTML='Hello Webpack';
3.Webpack打包输出
终端(命令行)中输入
npx webpack
将会在./dist把编译结果输出为main.js (没有 webpack.config.js 的默认配置)
目录结构:
|-- ./dist // 最终使用代码
|-- ./node_modules // 各个依赖开发包
|-- ./src // 源文件
|-- ./package.json // 配置脚手架
入口与出口
1.在项目根目录下创建webpack.config.js(webpack配置文件)
const path = require('path')
module.exports={
entry:{
main:'./src/index.js'
},
output:{
filename: 'bundle.js',
path: path.resolve(__dirname, './dist')
},
module:{},
plugins:[],
devServer:{}
}
终端(命令行)中输入
npx webpack
2.多入口、多出口配置
(1)src目录下新建index1.js(src/index1.js)
alert('welcome to jsfan.net')
(2)修改项目根目录下webpack.config.js为
const path = require('path')
module.exports={
entry:{
main:'./src/index.js',
index1:'./src/index1.js'
},
output:{
filename:'[name].js',
path: path.resolve(__dirname, './dist')
},
module:{},
plugins:[],
devServer:{}
}
(3)终端(命令行)中输入
npx webpack
(4)在dist文件中index.html中引入
<script src='./index1.js'></script>
热更新
1.安装 webpack-dev-server
npm install webpack-dev-server --save-dev
2.配置webpack.config.js中的devServer为
devServer:{
//服务器的IP地址,可以使用IP也可以使用localhost
host:'localhost',
//配置服务端口号
port:'8080',
//自动打开浏览器
open:true,
//热加载
hot:true,
//服务端压缩是否开启
compress:true,
}
3.修改webpack.config.js
(1).引入webpack
const webpack=require('webpack');
(2).修改plugins
plugins:[
//热更新插件
new webpack.HotModuleReplacementPlugin()
],
(3).向output中添加publicPath
output:{
publicPath:'/dist',//必须加publicPath
filename:'[name].js',
path: path.resolve(__dirname, './dist')
},
4.修改package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"server": "webpack-dev-server"
},
5.运行(终端中输入)
npm run server
注释:
运行出现Cannot find module 'webpack-cli/bin/config-yargs’时
npm install webpack-cli//(重新运行)
运行出现Cannot find module 'webpack’时
npm i webpack -D//(重新运行)
CSS文件打包
1.安装style-loader与css-loader
npm i style-loader css-loader -D
2.配置webpack.config.js中的module为
module:{
rules:[
{ //css使用
test:/\.css$/, //用于匹配处理文件的扩展名的表达式,这个选项是必须进行配置的;
use:[ //loader名称,就是你要使用模块的名称,这个选项也必须进行配置,否则报错
'style-loader',
'css-loader'
],
//include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选)
//query:为loaders提供额外的设置选项(可选)
}
]
},
3.在src中新建css文件夹且创建index.css(src/css/index.css)
body{
background-color: red;
color: white;
}
4.在src中index.js内引用(src/index.js)
import './css/index.css'
5.运行
npm run server
打包HTML文件
1.安装html-webpack-plugin
npm install --save-dev html-webpack-plugin
2.在webpack.config.js中引入
const htmlPlugin= require('html-webpack-plugin')
3.配置webpack.config.js中的plugins为
plugins:[
//热更新插件
new webpack.HotModuleReplacementPlugin(),
//打包HTML插件
new htmlPlugin({
minify:{ //对html文件进行压缩
removeAttributeQuotes:true //removeAttrubuteQuotes去掉属性的双引号
},
hash:true, //开发中js有缓存效果,所以加入hash,这样可以有效避免缓存JS
template:'./src/index.html' //要打包的html模版路径和文件名称
})
],
4.在src目录下新建index.html(src/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>webpack</title>
</head>
<body>
<div id='title'></div>
</body>
</html>
5.删除dist目录且重新打包
npx webpack
CSS中的图片处理
1.安装file-loader与url-loader
npm install --save-dev file-loader url-loader
2.修改src目录下index.html(src/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>webpack</title>
</head>
<body>
<div id='tupian'></div>
<div id='title'></div>
</body>
</html>
3.修改src->css目录下index.css(src/css/index.css)
body{
background-color: red;
color: white;
}
#tupian{
background-image: url(../images/全局npm.png);
width:500px;
height:500px;
}
4.配置webpack.config.js中的module为
rules:[
{ //css使用
test:/\.css$/, //用于匹配处理文件的扩展名的表达式,这个选项是必须进行配置的;
use:[ //loader名称,就是你要使用模块的名称,这个选项也必须进行配置,否则报错
'style-loader',
'css-loader'
],
//include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选)
//query:为loaders提供额外的设置选项(可选)
},
{ //css中图片使用
test:/\.(png|svg|jpg|gif)$/,
use:[{
loader:'url-loader',
options:{
//大于此大小则打包成图片
limit:500000 //把小于500000B的文件打成Base64的格式,写入JS
}
}]
},
]
5.打包且检验
npx webpack
npm run server
处理HTML中的图片
1.安装html-withimg-loader
npm install html-withimg-loader --save
2.配置webpack.config.js中的module为
module:{
rules:[
{ //css使用
test:/\.css$/, //用于匹配处理文件的扩展名的表达式,这个选项是必须进行配置的;
use:[ //loader名称,就是你要使用模块的名称,这个选项也必须进行配置,否则报错
'style-loader',
'css-loader'
],
//include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不需要处理的文件(文件夹)(可选)
//query:为loaders提供额外的设置选项(可选)
},
{ //css中图片使用
test:/\.(png|svg|jpg|gif)$/,
use:[{
loader:'url-loader',
options:{
limit:500, //把小于500B的文件打成Base64的格式,写入JS 大于此大小则打包成图片
outputPath:'images/', //输出的文件夹 大于此大小则打包成图片输出
esModule:false //html-webpack-plugin与html-withimg-loader发生了冲突解决方法
}
}]
},
{ //将html与htm中的img打包出来
test: /\.(htm|html)$/i,
use:[ 'html-withimg-loader']
},
]
},
注:file-loader升级到5.0了,所以需要在file-loader的options里使用一个配置:esModule:false(url-loader包含file-loader大多功能)
3.向src目录下的index.html中增加(图片自行添加)
<div><img src="images/孤独.png" alt=""></div>
4.打包及热更新
npx webpack
npm run server
Less文件的使用与打包
1.安装Less
npm install --save-dev less
2.在原有的基础上安装less-loader(原有基础:style-loader css-loader)
npm n install --save-dev less-loader
3.向webpack.config.js中的module增添
{
test:/\.less$/,
use:[
'style-loader',
'css-loader',
'less-loader',
]
},
4.编写black.less(/css/black.less)
@base :#000;
#gogo{
width:300px;
height:300px;
background-color:@base;
}
5.引入到index.js文件中
import './css/black.less'
6.打包及热更新
npx webpack
npm run server
Sass文件的使用与打包
1.安装Sass
npm install --save-dev node-sass
2.在原有的基础上安装sass-loader(原有基础:style-loader css-loader)
npm install --save-dev sass-loader
3.向webpack.config.js中的module增添
{
test: /\.scss$/,
use:[
'style-loader',
'css-loader',
'sass-loader',
]
}
4.编写Sass.scss(/css/Sass.scss)
$nav-color: #FFF;
#nav {
$width: 100%;
width: $width;
height:30px;
background-color: $nav-color;
}
5.引入到index.js文件中
import './css/Sass.scss'
6.打包及热更新
npx webpack
npm run server
css代码分离
1.安装mini-css-extract-plugin
npm install mini-css-extract-plugin -D
2.向webpack.config.js中增添
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
2.向webpack.config.js中的module增添
{
test: /\.css$/i,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: { //解决打包后背景图丢失问题
publicPath: '../',
},
},
'css-loader',
],
},
3.向webpack.config.js中的plugins增添
new MiniCssExtractPlugin({ //css分离
filename: 'style/[name].css',// 分离后的文件名
chunkFilename: '[id].css',
ignoreOrder: false//启用可删除有关顺序冲突的警告
}),
4.打包及热更新
npx webpack
npm run server
自动处理css前缀兼容不同浏览器
1.安装postcss-loader 和autoprefixer(自动添加前缀的插件)
npm install --save-dev postcss-loader autoprefixer
2.在项目根目录,建立postcss.config.js文件且写入
module.exports = {
plugins:[
require('autoprefixer')({
browsers : ['last 100 versions']
})
]
}
3.修改webpack.config.js中的module为
{
test: /\.css$/i,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: { //解决打包后背景图丢失问题
publicPath: '../',
},
},
'css-loader',
'postcss-loader'
],
},
4.打包及热更新
npx webpack
npm run server
5.打包效果展示
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
-webkit-box-shadow: 1px 1px 0 rgba(0, 0, 0, .25);
-moz-box-shadow: 1px 1px 0 rgba(0, 0, 0, .25);
box-shadow: 1px 1px 0 rgba(0, 0, 0, .25);
消除未使用的CSS
1.安装purify-css和PurifyCSS-webpack
npm i -D purifycss-webpack purify-css
2.在webpack.config.js中引入
const glob = require('glob');
const PurifyCSSPlugin = require('purifycss-webpack');
3.向webpack.config.js中的plugins增添
new PurifyCSSPlugin({
// 首先保证找路径不是异步的,所以这里用同步的方法
// path.join()也是path里面的方法,主要用来合并路径的
// 'src/*.html' 表示扫描每个html的css
paths: glob.sync(path.join(__dirname, 'src/*.html')),
})
4.打包及热更新
npx webpack
npm run server
集成babel支持
1.安装babel-loader、babel-core、babel-preset-env
npm install -D babel-loader babel-core babel-preset-env
注:babel-loader安装最新版本后博主出现打包错误
package.json中更改其版本为"^7.0.0"后恢复正常
2.在项目根目录下创建.babelrc文件且输入
{
"presets": ["env"]
}
3.向webpack.config.js中的module增添
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
}
4.向js文件中增添es6语法
5.打包及热更新
npx webpack
npm run server
开启打包调试
向webpack.config.js中entry的同级目录增添
//开发者模式 可调错
devtool:'source-map',
//开启调试功能,上线之前需将此行注释
1.source-map:在一个单独文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包速度;
2.cheap-module-source-map:在一个单独的文件中产生一个不带列映射的map,不带列映射提高了打包速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便。
3.eval-source-map:使用eval打包源文件模块,在同一个文件中生产干净的完整版的sourcemap,但是对打包后输出的JS文件的执行具有性能和安全的隐患。在开发阶段这是一个非常好的选项,在生产阶段则一定要不开启这个选项。
4.cheap-module-eval-source-map:这是在打包文件时最快的生产source map的方法,生产的 Source map 会和打包后的JavaScript文件同行显示,没有影射列,和eval-source-map选项具有相似的缺点。
上述选项由上到下打包速度越来越快,同时也具有越来越多的负面作用,较快的打包速度的后果就是对打包后的文件的的执行有一定影响。
引入第三方库
1.安装JQuery
npm install --save jquery
2.向index.js文件中增添
import $ from 'jquery';
3.当前文件中使用JQ
watch自动打包
运行watch
npx webpack --watch
--END--