在项目中建议将webpack安装至当前项目而不是全局,这样避免你的小伙伴没有安装或者安装了其他版本的webapck
webpack-test
,生成package.json
文件npm init -y
npm i webpack webpack-cli -D
webpack
安装版本webpack -v
webpack-test
项目中新建src
,src
中新建math.js
、index.js
// math.js
export function add (x, y) {
return x + y
}
export function reduce (x, y) {
return x - y
}
// index.js
import { add, reduce } from './math.js'
const result1 = add(11, 22)
const result2 = reduce(11, 22)
console.log(result1);
console.log(result2);
执行命令 webapck
,它会默认找./src/index.js
作为入口文件
你可以看到已经打包出一个dist/main.js
执行webpack --help
可以看到webapck
有很多命令可以使用,比如刚才执行的webpack
你可以使用这样一个命令行得到相同结果,当然你要先删除dist
webpack --entry ./src/index.js --mode production
也会得到dist/main.js
打包产物
但是这样使用命令行不方便、不直观也不能保存一些其他配置
我们可以使用webpack configuration进行配置
webpack.config.js
// webpack.config.js
const path = require('path')
module.exports = {
entry: './src/index.js', // 入口文件
// 出口配置
output: {
filename: 'bundle.js', // 出口文件名
// 绝对路径
path: path.resolve(__dirname, './dist') // path.resolve(__dirname) 表示获取当前文件的物理路径,即绝对路径
},
mode: 'none' // 打包模式
}
webpack
会默认找到webpack.config.js
配置。可以看到会打包出dist/bundle.js
,并且内容与dist/main.js
内容并不一致,而且dist/main.js
还存在。我们稍后说这两个问题。index.html
,并加载dist/bundle.js
,使用编辑器内置的server
或者直接在浏览器加载index.html
可以在控制台看到打印结果33
-11
,表明webpack打包成功。html-webpack-plugin
index.html
加载dist/bundle.js
,那如何自动生成index.html
并引入打包资源呢?npm install --save-dev html-webpack-plugin
在webpack.config.js
引入并在plugins
中实例化它
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...
plugins: [
new HtmlWebpackPlugin()
]
}
执行webpack
,可以看到dist/index.html
,在浏览器打开控制台中可以看到可以正常打印结果33
-11
。但是目前这个文件和我们前面建的index.html
还没有什么关联。那我们可以让他们关联起来,或者说通过配置让HtmlWebpackPlugin
基于我们的index.html
生成文件
配置html-webpack-plugin
option
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...
plugins: [
new HtmlWebpackPlugin({
template: './index.html', // 模板
filename: 'index.html', // 文件名称
inject: 'body' // 定义生成的script所在的位置
})
]
}
index.html
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>webpack-自动引入资源-HtmlWebpackPlugintitle>
head>
<body>
<h1>Hello worldh1>
body>
html>
webpack
,可以看到dist/index.html
生成了,并且内容也是我们想要的,在浏览器打开可以正常打印结果33
-11
我们执行webpack
后发现我们之前生成的一些文件还在,但事实上我们并不需要他们了,那我们该怎么在生成新的dist前清除掉旧的打包资源呢
只需要简单的配置即可。在output
中配置clean: true
即可
// webpack.config.js
module.exports = {
output: {
clean: true, // 在生成文件之前清空 output 目录
}
}
执行webpack
,可以看到打包后只有index.html
和bundle.js
,旧文件已经被清除了,index.html
访问也是正常的
通过选择 development
, production
或 none
之中的一个,来设置 mode
参数,你可以启用 webpack 内置在相应环境下的优化。其默认值为 production
。
// webpack.config.js
module.exports = {
mode: 'production',
};
SourceMap能帮助我们在浏览器中调试时看到源码,以帮助我们精准的定位问题代码位置,你只需要在webpack.config.js
配置devtool: 'inline-source-map'
即可开启
watch监听文件变化,当它们修改后会重新编译
webpack-dev-server 和webapck --watch的区别
webpack --wacth
或者
// webpack.config.js
module.exports = {
// ...
watch: true,
};
watch 的唯一的缺点是,为了看到修改后的实际效果,我们需要刷新浏览器。如果能够自动刷新浏览器就更好了,因此接下来我们会尝试通过 webpack-dev-server
实现此功能。
npm install --save-dev webpack-dev-server
webpack-dev-server
为我们提供了一个基本的 web server,并且具有 live reloading(实时重新加载) 功能。
// webpack.config.js
module.exports = {
devServer: {
static: './dist',
port: 9000, // 定义端口
open: true // 自动打开浏览器
},
};
以上配置告知 webpack-dev-server
,将 dist
目录下的文件 serve 到 localhost:9000
下。
打开控制台可以看到
Hot Module Replacement
热模块更新替换生效了
Live Reloading
实时更新生效了
即热更新生效了
Warning
webpack-dev-server
在编译之后不会写入到任何输出文件。而是将 bundle
文件保留在内存中,然后将它们 serve
到 server
中,就好像它们是挂载在 server
根路径上的真实文件一
这样会提高我们的开发效率,也会提高webpack
的编译效率
源码地址:https://gitee.com/yanhuakang/webpack-test
如果有用,就点个赞吧(*^▽^*)