webpack4完整使用,优化打包教程

1 篇文章 0 订阅
1 篇文章 0 订阅

最近在使用vue-cli创建的项目时候,看见了webpack,终于明白了点什么是打包,所以花了两个礼拜来整理webpack的笔记。好在以后能够开发自己项目时用的着

前期安装

1.安装node

1.1.网上下载node直接安装

2.初始化一个node项目

npm init

3.安装webpack 和webpack-cli

//局部安装(推荐)
npm install --save-dev webpack webpack-cli
//全局安装
npm install --global webpack webpack-cli

4.新建webpack.config.js 和配置package.js

4.1.在主目录下新建一个webpack.config.js文件

const path = require("path");//引入node路径模块

/* module.exports={
	entry:"./src/main.js",//单入口的 单文件
	output:{//单出口
		path:path.resolve(__dirname,"public"),
		filename:"mainOut.js"
	}
} */


/* module.exports={
	entry:["./src/main.js","./src/main2.js"],//单入口的 多文件
	output:{//单出口
		path:path.resolve(__dirname,"public"),
		filename:"mainOut.js"
	}
} */


module.exports={
	entry:{//多入口
		page1:'./src/page01/page01.js',
		page2:'./src/page02/page02.js'
	},
	output:{//多出口, 这里的[name] 对应 page1 和 page2 取代
		path:path.resolve(__dirname,"public"),
		filename:"[name].js"
	}
}

4.2.配置package.js的scripts

"scripts": {
	//dev 是开发模式打包命令
	//build 是生存打包命令
    "dev": "webpack --mode development",
    "build": "webpack --mode production"
  },

4.3.webpack打包命令

//生成开发模式的 打包文件
npm run dev
//生成生产模式的 打包文件

5.安装webpack-dev-server

5.1.webpack-dev-server是将你打包的文件配置到本地服务器上(运行它的命令会给你电脑自动创建一个本地服务器),在开发过程中,实现更新和热替换。说简单点,就是在开发阶段,方便你调试用的工具
5.2.安装

npm install --save-dev webpack-dev-server

5.3.在webpack.config.js中配置服务器

devServer:{
		contentBase:"./build",//服务器访问的基本路径
		host:'localhost',//服务器ip
		port:8080,//端口
		open:true,//自动打开页面
	}

5.4.配置package.json

"scripts": {
    "dev": "webpack --mode development",
    "build": "webpack --mode production",
    //多了一步 打包完了之后,通过 命令来启动
	"start":"webpack-dev-server --mode development"
  },

5.5.启动webpack-dev-server

npm run start

loader 安装

loader 是将各个不同文件打包成js能处理的文件模板 (我是这样理解的)

1.css文件

1.1.安装style-loader 和 css-loader

npm install style-loader css-loader --save-dev

1.2.配置webpack.config.js

module:{
		rules:[
			{
				test:/\.css$/,//处理css文件
				use:["style-loader","css-loader"]
			},
		]
	}

2.less 和 sass文件

2.1.安装

//less的loader
npm install less-loader less --save-dev
//sass的loader
npm install sass-loader node-sass --save-dev

2.2.配置webpack.config.js

module:{
		rules:[
			{
				test:/\.css$/,//处理css文件
				use:["style-loader","css-loader"]
			},
			{
				test:/\.less$/,//处理less文件
				use:["style-loader","css-loader","less-loader"]
			},
			{
				test:/\.scss$/,//处理sass文件,文件名后缀为.scss
				use:["style-loader","css-loader","sass-loader"]
			},
		]
	}

备注:安装和使用node-sass出现问题,可参考
1、https://www.jianshu.com/p/92afe92db99f
2、https://blog.csdn.net/ze1024/article/details/100516650
如果npm命令安装node-sass失败,可以使用cnpm试试。一般情况下,需要将node-sass安装最高版本
cnpm install node-sass@latest

3.POSTCSS自动添加浏览器前缀

3.1.安装

npm install postcss-loader autoprefixer --save-dev

3.2.配置方法一:webpack.config.js,这里以css文件为例子

test:/\.css$/,//处理css文件
use:["style-loader","css-loader",{
	loader:"postcss-loader",
	options:{
		plugins:[
			require("autoprefixer")({
				browsers:[
					"ie >= 8",//ie大于8
					"Firefox >= 20",//火狐大于20
					"Safari >= 5",//safari大于5版本
					"Android >= 4",//版本大于andiroid4
					"Ios >= 6",//版本大于ios6
					"last 4 version",//浏览器最新的四个版本
				]
			})
		]
	}
}]

3.3.配置方法二:package.json

//此处为webpack.config.js设置
test:/\.css$/,//处理css文件
use:["style-loader","css-loader",{
	loader:"postcss-loader",
	options:{
		plugins:[
			require("autoprefixer"),
		]
	}
}]
//此处为package.json设置
"browserslist":[
	  "ie >= 8",
	  "Firefox >= 20",
	  "Safari >= 5",
	  "Android >= 4",
	  "Ios >= 6",
	  "last 4 version"
  ]

推荐使用方法二,因为css文件有less和lass类型等,在package.json中统一设置了,就不用在每一种文件下设置浏览器配置了,但是以下这个loader还是不能少的

loader:"postcss-loader",
options:{
	plugins:[
		require("autoprefixer"),
	]
}

4.文件处理—图片处理

4.1.安装

npm install file-loader --save-dev

4.2.选项配置options
name:为你的文件配置自定义文件名的模板(默认【hash】.【ext】)
context:配置自定义文件的上下文(默认为 webpack.config.js)
publicPath:为你的文件配置自定义 public 发布目录(可以是一个url地址,打包之后,图片路径就成了url上的路径,我的理解是将图片重定向到另一个地址)
outputPath:为你的文件配置自定义 output输出目录
备注:【】说明
[ext]:资源扩展名
[name]: 资源的基本名称(原来的名称)
[path]:资源相对于context 的路径
[hash]:内容的哈希值

5.文件处理—字体文件

5.1.使用的loader与图片一致
5.2.配置

//字体文件
{
	test:/\.(eot|svg|ttf|woff|woff2)$/,
	use:"file-loader"
}

6.文件处理—第三方js库处理

6.1.方法一:本地导入(以jquery为例子)

//webpack.config.js中引入webpack
const webpack = require("webpack");
	//引入第三方js 本地导入的方式
	resolve:{
		alias:{
			jquerysB:path.resolve(__dirname,"src/js/jquery.min.js")
		}
	},
	plugins:{
		//使用webapck插件来 使用 本地导入的第三方js
		new webpack.ProviderPlugin({
			Jquery2:"jquerysB",//在自己js中使用Jquery2来代替$和jquery的使用
		})
	}

6.2.方法二:npm安装第三方库(推荐)

npm install jquery --save-dev

在js中引入使用

import $ from "jquery"

7.babel 编译ES6

7.1.安装
babel-loader//负责es6语法转化
babel-core//babel核心包
babel-preset-env//告诉babel使用哪种转码规则进行文件处理

npm install babel-loader @babel/core @babel/preset-env --save-dev

7.2.config配置

//js处理
{
	test:/\.js$/,
	exclude:/node_modules/,//排除对node_modules文件夹进行处理
	use:"babel-loader"
}

7.3.新建.babelrc 文件,配置转换规则(推荐)

{
	"presets":["@babel/preset-env"]
}

7.4.配置转换规则,直接在config中配置

//js处理
{
	test:/\.js$/,
	exclude:/node_modules/,//排除对node_modules文件夹进行处理
	use:{//直接在use中配置转换规则
		loader:"babel-loader",
		options:{
			"presets":["@babel/preset-env"]
		}
	}	
}

7.4.使用:可以直接在自己js文件中使用es6语法

8.生成HTML(打包后自动生成html文件)

8.1.html-webpack-plugin插件
该插件会根据指定的index.html模板生成对应的html文件
8.2.安装

npm install html-webapck-plugin --save-div

8.3.配置config.js

const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports={	
	//......
	//配置插件
	plugins:{
		new HtmlWebpackPlugin({
			template:"./src/index.html",//模板文件路径
			filename:"webpack.html",//生成的文件名称
			minify:{
				minimize:true,//是否打包成最小值
				removeAttributeQuotes:true,//去除引号
				removeComments:true,//去除注释
				collapseWhitespace:true,//去除空格
				minifyCSS:true,//压缩html内的样式
				minifyJS:true,//压缩htmt内的js
				removeEmptyElements:true,//清除内容为空的元素
			},
			hash:true,//引入产出资源的时候加上哈希避免缓存
		})
	}
}

9.提取分离CSS

9.1.作用
将所有入口chunk(entry chunks)中引用的css文件,移动到独立分离的css文件
js文件和css文件打包后分离
9.2.安装(老版本ExtractTextPlugin插件)

npm install extract-text-webpack-plugin@next --save-dev

9.2.1.配置config.js

const ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports={
	modules:{
		rules:[
			{
				test:/\.css$/,
				use:ExtractTextPlugin.extract({
					fallback:"style-loader",//编译后用什么loader来提取css文件
					use:"css_loader"
				})
			},
		]
	},
	plugins:{
		new ExtractTextPlugin("./css/[name].css")//打包后的文件路径
	}
	
}

9.3.新版本插件 mini-css-extract-plugin

npm install mini-css-extract-plugin --save-dev

9.3.1.配置config.js

const MiniCssExtractPlugin= require("mini-css-extract-plugin")
module.exports={
	modules:{
		rules:[
			{
				test:/\.css$/,
				use:[MiniCssExtractPlugin.loader,"css-loader"]
			},
		]
	},
	plugins:{
		new MiniCssExtractPlugin({
			filename:"./css/[name].css"//打包后的文件名
		})
	}
	
}

10.压缩和优化css

10.1.安装

npm install optimize-css-assets-webpack-plugin --save-dev

10.2.配置config.js

const OptimizeCssAssetsPlugin =require("optimize-css-assets-webpack-plugin");
plugins:{
	new OptimizeCssAssetsPlugin({
		assetNameRegExp:/\.css$/g,//用于匹配需要优化或者压缩的资源名,默认为/\.css$/g
		cssProcessor:require("cssnano"),//用于压缩或者优化的处理器,默认为cssnano
		cssProcessorPluginOptions:{//传递给cssProcessor的插件选项,默认为{}
			//discardComments去除注释
			preset:["default",{discardComments:{removeAll:true}}]
		},
		canPrint:true,//插件能够在console中打印信息,默认为true
	})
}

11.拷贝静态文件

11.1.一些没有用到的文档或者静态图片
11.2.安装

npm install copy-webpack-plugin --save-dev

11.3.配置config.js

const CopyWebapckPlugin = require("copy-webpack-plugin");
plugins:{
	new CopyWebapckPlugin([
		{
			//__diname表示项目根目录,当路径中存在../的时候,可以使用 path.resolve(__diename, "../路径")来合并路径
			from:__dirname + "原文件夹相对路径",
			to:__dirname + "保存文件夹相对路径",
		}
	])
}

12.清除文件

12.1.当我们修改带有hash的文件并进行打包的时候,每打包一次就会生成一个新的文件,而旧的文件并没有删除
12.2.安装

npm install clean-webpack-plugin --save-dev

12.3.配置config.js

const CleanWebpackPlugin = require("clean-webpack-plugin")
plugins:{
	new CleanWebpackPlugin(["build"],{
		root:path.resolve(__dirname,"../")//修改build文件夹的路径,当该文件不在项目文件夹是,需要根据实际情况使用
	})//要删除的文件的文件夹或者文件,一般情况下删除 生成的文件夹就好
}

13.HTML中引入图片

13.1.在进行打包之后,html中引入的本地图片是无法生效的
13.2.安装

npm install html-loader --save-dev

13.3.配置config.js

//html文件
{
	test:/\.(html)$/,
	use:{
		loader:"html-loader",
		options:{
			attrs:['img:src','img:data-src']//哪些标签的属性进行图片处理
		}
	}
}

14.sourcemap调试

14.1.为了解决实际运行代码(打包后)出现问题时无法定位到开发环境中的源代码的问题
14.2.devtool的五个基本类型

1.eval

为每一个模块添加eval(),并且在模块后增减sourceURL来关联模块处理前后的关系,简单的说,能够定位到原代码文件路径,但不能定位到行号。打包速度快。

2.source-map

会为模块生成独立的sourcemap文件。打包后的模块,会对应生成一个.map文件

3.lnline

不会生成.map文件,sourmap转换为DataUrl后添加到bundle中

4.cheap

会生成.map,与source-map的区别,cheap生成的map文件会忽略原始代码的列信息,也不包含loader的sourcemap

5.module

包含loader之间的sourcemap,将loader source map 简化为每行的一个映射
14.3.启动source,js调试和css调试

module.exports={
	//.....
	devtool:" cheap-module-eval-source-map",//以多重方式启动调试,可以进行js调试
	//css调试
	modules:{
		rules:[
			{
				test:/\.css$/,
				use:["style-loader",
				{
					loader:"css-loader",
					options:{
						sourceMap:true
					}
				}]
			}
		]
	}
	//......
}

14.4.开发模式下,建议使用 cheap-module-eval-source-map
14.5.生成模式下(打包),建议使用source-map

15.模块热替换

15.1.配置config.js

//在本地服务器配置中添加hot:true
devServer:{
	contentBase:"./build",//服务器访问的基本路径
	host:'localhost',//服务器ip
	port:8080,//端口
	open:true,//自动打开页面
	hot:true,//开启模块热替换
	hotOnly:true,//只热更新,不会重新加载页面(节省开发时间,可以开启,但是js更新需要按下面进行配置)
		//开启hotOnly之后
		/* 需要在js文件最后面加上
		if(module.hot){
			module.hot.accept()
		}
		不然,js不会起效果 */
		//另外css文件,如果使用了MiniCssExtractPlugin.loader需要更改成style-loader
},

//plugins中添加
new webpack.NamedModulesPlugin(),//打印出更新位置
new webpack.HotModuleReplacementPlugin(),//热替换

16.开发环境与生存环境的区分

16.1.安装合并两个配置文件的依赖

npm install webpack-merge --save-dev

16.2.拆分一个config.js
将一个config.js拆分成webpack.base.js (公用配置)和webpack.dev.js (开发), webpack.pro.js(生产)

1.webpack.base.js

该文件下一般放置,webpack的入口与出口, modules和new HtmlWebpackPlugin(加载html)

2.webpack.dev.js

devtool:“source-map”
devServer:{}
new webpack.NamedModulesPlugin(),//打印出更新位置
new webpack.HotModuleReplacementPlugin(),//热替换

3.webpack.pro.js

new CleanWebpackPlugin([“build”])
new MiniCssExtractPlugin
new OptimizeCssAssetsPlugin
new CopyWebapckPlugin

16.3.webpack.dev.js与webpack.pro.js需要使用webpack-merge来结合webpack.base.js(以webpack.dev.js为例子)

//开发模式需要使用的模块引用
const merge =require("webpack-merge")
const common = require("./webpack.base.js")

module.exports = merge(common, {
	//生产模式下的配置
})

16.4.修改package.json的scripts

"scripts": {
   "dev": "webpack --mode development --config ./webapck.dev.js",
    "build": "webpack --mode production --config ./webpack.pro.js",
	"start":"webpack-dev-server --mode development --config ./webpack.dev.js"
},

17.优化打包速度

17.1.当文件比较多的时候,优化打包速度就非常有必要
17.2.优化方法

1.减少文件的搜索范围

1.1.优化resolve.extensions配置,该配置在文件没有写后缀名的时候,会默认使用配置好的后缀列表区尝试寻找对应的文件
1.2.优化resolve.modules配置,该配置设置去哪些目录下查找第三方模块,默认为node_modules
1.3.优化resolve.alias配置,该配置通过别名把原有导入路径映射陈一个新的导入路径(给路径取别名)
1.4.在rules中使用include和exclude来设置需要处理和不需要处理的文件路径

function resolve(dir){
	return path.join(__dirname,"..",dir);//根据具体路径设置
}
module.exports={
	//优化担保速度
	resolve:{
		extensions:[".js"],//文件扩展名尝试
		modules:[
			resolve("public"),
			resolve("node_module")
		],//模块的路径
		alias:{
			"alias1":resolve("./public/assets")
		},//路径别名设置
	}
}
2.设置noParse(一般用不到)
3.给babel-loader设置缓存
//js处理
{
	test:/\.js$/,
	exclude:/node_modules/,//排除对node_modules文件夹进行处理
	use:"babel-loader?cacheDirectory=true"//设置缓存
},
4.使用happyPack(使用多进程来处理js,css,图片,字体等)

安装

npm install happypack --save-dev

配置config.js

const HappyPack = require("happypack");

//rules中
//js处理
{
	test:/\.js$/,
	exclude:/node_modules/,//排除对node_modules文件夹进行处理
	loader:"happypack/loader?id=happyBabel"//此处id在下方有配置
	//use:"babel-loader?cacheDirectory=true"//该处理放在了happypack中
},
//plugins中
new HappyPack({
	id:"happyBabel",//此处的id要与rules中对应
	loaders:[{
		loader:"babel-loader?cacheDirectory=true"
	}]
})

备注:当项目比较小的时候,happypack效果反而不如不使用,所以当项目比较小的时候,前面三种更适合一点

如果你看到最后,肯定很累吧,没错,我当时写的也很累,给个赞鼓励一下呗。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值