webpack打包过程

目录

如果还没了解npm请参考webpack安装前准备


创建文件目录

创建文件
project_name
├── dist
├── src
│ ├── css
│ ├── images
│ ├── js
│ ├── index.html
│ └── main.js		//项目入口文件

初始化

操作

在本项目下的终端输入:npm init -y

注:
-y 参数表示默认所有选项 yes

效果
project_name
├── dist		//打包后生成的目录文件
├── src
│ ├── css
│ ├── images
│ ├── js
│ ├── index.html
│ └── main.js		//项目入口文件
├── `package.json`		//多了个项目的配置文件

package.json文件,这个文件中会记录一些关于项目的信息,比如:项目的作者,git地址,入口文件、命令设置、项目名称和版本号等等,一般情况下这个文件是必须要有的,方便后续的项目添加和其他开发人员的使用。

安装webpack

操作

在本项目下的终端输入以下两条命令:
npm i webpack --save-dev 或 -D
npm i webpack-cli --save-dev 或 -D

注:

在 webpack4 中不仅要安装 webpack 本身,还要安装 webpack-cli
–save、-S 参数意思是把模块的版本信息保存到dependencies(生产环境依赖)中,即你的package.json文件的dependencies字段中;
–save-dev 、-D 参数意思是吧模块版本信息保存到devDependencies(开发环境依赖)中,即你的package.json文件的devDependencies字段中;

效果

文件目录

project_name
├── dist
├── src
├── package.json
├── `mode_modules`		//多了个mode_modules文件夹
├── `package-lock.json`		//多了个packge-lock.json文件

package.json

{
  "devDependencies": {		//生产依赖环境
    "webpack": "^4.41.1"	//有了webpack
  }
}

安装依赖

操作 (这里以 jquery 为例)

1.安装jquery

在本项目下的终端输入:
npm i jquery --save 或 -S

2.在入口文件导入安装好的jquery

//main.js
import $ from 'jquery'		//在入口文件中导入jquery

$(function () {		//这里为测试代码
	$('li').css('color','#b89')
}

loader

webpack 自身自能读懂js类型的文件,像ES6、JSX、less、typescript 等,甚至css、images 这些文件想要编译打包需要借助 loader

操作 ( 加载 css 和 less )

终端

npm i style-loader css-loader -D //安装 css 相对应的loader
npm i less less-loader -D //安装 less 相对应的loader

注:
style-loader 负责把处理完的css放到html头部
css-loader 负责处理css

webpack.config.js

module.exports = {
	module: {
		rules: [ 	//规则
			{ test: /\.css$/, use: [ 'style-loader', 'css-loader'] },
			{ test: /\.less$/, use: [ 'style-loader', 'css-loader', 'less-loader' ] }
		]
	}
}

注:
style-loader css-loader 的顺序不能调换,Loader的执行顺序是由后往前的

效果

我们就可以在入口文件引入 css 和 less

import './src/main.css'
操作 ( 加载 图片 )

终端

npm i url-loader -D //安装 url-loader
npm i file-loader -D //安装 file-loader

webpack.config.js

module.exports = {
	module: {
		rules: [ 	//规则
			{ 
				test: /\.(jpg|png|gif)$/,
				loader: "url-loader",
				include: [ path.resolve(__dirname,'src') ],
				options: {
					limit: 10000,
					name: "images/[name].[hash:7].[ext]"
				}
			}
		]
	}
}

注:
url-loader 可以设置图片大小限制,当图片大小超过 limit 限制时,其表现行为等同于 file-loader,而当图片不超过限制时,则会将图片以 base64 的形式打包经行 css 文件,以减少请求次数
limit 图片大小限制
include 想要对图片进行 url-loader 转换的文件夹

操作 ( ES6 语法转换 )

终端

npm i babel-loader @babel/core @babel/preset-env -D
npm i @babel/plugin-proposal-class-properties -D
npm i @babel/plugin-proposal-decorators -D
npm i @babel/runtime @babel/plugin-transform-runtime -D

注:
babel-loader 加载器
@babel/core babel 核心包, babel-loader 的核心依赖
babel/preset-env ES语法分析包
@babel/plugin-proposal-class-properties 用来解析类的属性的
@babel/plugin-proposal-decorators 装饰器
@babel/runtime @babel/plugin-transform-runtime babel 编译时只转化语法,几乎可以编译所有新的JavaScript语法,但并不会转化BOM(浏览器)里面不兼容的API。比如 Promise, Set, Symbol, Array, from, async 等等的一些API。这两个包就是来搞定这些API的。

webpack.config.js

module.exports = {
	module: {
		rules: [ 	//规则
			{ 
				test: /\.js$/,
				use: {
					loader: 'babel-loader',		//用babel-loader把 es6 -> es5
					options: {
						presets: [
							'@babel/preset-env'			//根据你支持的环境自动决定适合你的babel插件
						],
						plugins: [		// plugin 是需要的插件
							[ '@babel/plugin-proposal-decorators', { 'legacy': true } ],
							[ '@babel/plugin-proposal-class-properties', { 'loose': true } ],
							'@babel/plugin-transform-runtime'
						]
					},
				},
				include: path.resolve(__dirname,'src'),		//指定处理文件,优化处理速度
				exclude: /node_modules/		//不处理node_modules,优化处理速度
			}
		]
	}
}
操作 ( vue )

终端

npm i vue -S
npm i vue-loader vue-template-compiler -D

webpack.config.js

const VueLoaderPlugin = require('vue-loader/lib/plugin')
module.exports = {
	plugin: [
		new VueLoaderPlugin()		//VueLoaderPlugin 在 vue-loader v15的版本中,这个插件是必须启用的
	],
	module: {
		rules: [ 	//规则
			{ test: /\.vue$/, use: 'vue-loader' }
		]
	}
}

main.js 入口文件

//import Vue from 'vue'		默认加载阉割版的vue
import Vue from '../node_modules/vue/dist/vue.js'
import app from './App.vue'

let vm = new Vue({
	el: '#app',
	data: function () {
		return {
			msg: 'hello word'
		}
	},
	render: c => c(app)		//function (createElement) { createElement(app) }
})

App.vue

<template>
	<div>
		<h4>这是App组件</h4>
	</div>
<template>

<script>
	export default {
		name: 'App',
		data () {
			return{}
		},
		methods: {
		
		}
	}
</script>

<style scoped>

</style>

终端

npm i vue-router -S

main.js 入口文件

import Vue from '../node_modules/vue/dist/vue.js'		//导入vue完整包
import VueRouter from 'vue-router'			//导入vue路由包
Vue.use(VueRouter)			//安装vue路由

import app from './App.vue'
import router from './router.js'		//导入自定义路由

let vm = new Vue({
	el: '#app',
	data() {
		return {
			msg: 'hello word'
		}
	},
	render: c => c(app),
	router
})

打包文件

1.基础用法(无需配置webpack.config.js文件)

操作

在终端输入:
webpack .\src\main.js -o .\dist\bundle.js --mode=development

注:
.\src\main.js 为被打包文件路径
.\dist\bundle.js 为打包后文件路径
–mode=development 为引入模式

package.json 文件中自定义指令简化输入

{
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "go": "webpack ./src/main.js -o ./dist/bundle.js --mode=development"
  }
}

注:
在绝大多数地方,用的都是 /(slash),包括Mac/Linux,也包括URL表示路径分隔符;
只有Microsoft在自己的操作系统里面偏要用\(backslash),使得自己与众不同。
虽然现在在cmd中,已经不区分正斜杠和反斜杠了
但 \ 在大多数语言中是转义字符
所以在 package.json 文件中应该用 / 或者 \\ 用反斜杠将反斜杠转义

终端:

npm run go
等同于输入:
webpack .\src\main.js -o .\dist\bundle.js --mode=development

效果

文件目录

project_name
├── dist
│ └── `bundle.js`		//dist文件下生成个bundle.js文件

index.html直接通过<script>标签引用此文件

2.配置文件打包

操作
  1. 创建配置文件
    文件目录
project_name
├── dist
├── src
├── package.json
├── mode_modules	
├── package-lock.json		
├── `webpack.config.js`		//创建 webpack.config.js 文件
  1. 配置文件
const path = require ( 'path' )

module.exports = {
	mode: 'development',		//模式,默认两种 production development
	entry: './src/index.js',		//入口
	output: {
		filename: 'bundle.js',		//打包后文件名
		path: path.resolve( __dirname, 'dist' )		//路径必须是一个绝对路径
	}
}
  1. 命令行打包

webpack //自动寻找根目录下的配置文件进行打包

到这里我们的打包工作已经完成,如果你想要更方便的操作请往下读

webpack-dev-server

 在开发测试过程中,我们会经常修改代码后,需要手动打包,然后频繁刷新页面查看效果
 webpack-dev-server是webpack官方提供的一个小型Express服务器。使用它可以为webpack打包生成的资源文件提供web服务。
操作

终端
npm i webpack-dev-server -g 安装webpack-dev-server
webpack-dev-server 运行服务器
ctrl + c 停止运行服务器

index.html 的引用路径改为 <script src=‘http://localhost:8080/bundle.js’>

效果
  • http://localhost:8080/ 目录下会生成一个虚拟的 bundle.js 文件
  • 当我们修改代码保存时,webpack-dev-server 会自动打包生成虚拟 bundle.js
webpack-dev-server 的参数和配置

webpack-dev-server --open --hot contentBase src 可以添加参数实现更多功能


在 webpack.config.js 中配置参数

module.exports = {
	devServer: {
		open: true,		//输入命令后自动打开默认浏览器
		hot: true,		//重新加载组件改变部分(而不是重新加载整个页面)
		inline: true,		//刷新浏览器,如果添加了hot,在热加载失败后才会刷新浏览器
		contentBase: 'src',		//本地服务器所加载的页面所在的目录
		host: '127.0.0.1',		//设置端口号
		compress: true		//对所有的服务器资源采用gzip压缩
	}
}

webpack-dev-server //设置congfig后会根据设置参数进行加载

虚拟HTML

操作

npm i html-webpack-plugin -D //安装html-webpack-plugin插件

修改 webpack.config.js 文件

const HtmlWebpackPlugin = require('html-webpack-plugin');		//引入插件
module.exports = {
	plugins: [		//所有插件的配置节点
			new HtmlWebpackPlugin({		//打包输出HTML
			title: 'This is title',		//生成html文件的标题
			filename: 'index.html',		//输出html的文件名称
			template: './src/index.html',		//模板文件
			minify: {		//压缩HTML文件
				removeComment: true,		//移除HTML中得注释
				collapseWitespace: true,		//删除空白字符与换行
				minifyCSS: true			//压缩内联CSS
			}
		})
	]	
}

webpack-dev-server 终端输入命令运行服务器

效果

 内存中会生成虚拟得 index.html 文件,并引用虚拟得 bundle.js
 所以我们这里可以将上面 index.html 引用的 虚拟 bundle.js 改回本地 的 bundle.js

图解

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值