准备
- 新建 webpack-test 文件夹
- 目录
- src
- hello.js
export const hello= 'hello'
- main.js
import { hello } from './hello.js' console.log(hello + ' world')
- hello.js
- webpack.config.js
- package.json
- src
- 目录
打包 js 文件
安装 webpack、webpack-cli
npm i -D webpack webpack-cli在 webpack.config.js 中输入下面代码
module.exports = {
entry: { // 入口文件
main: './src/main.js'
},
output: { // 出口文件
path: __dirname + '/dist'
}
}
在 package.json 文件中编写命令行执行代码
"scripts": { "build": "webpack" }
终端输入:
npm run build生成 dist 文件夹,里面有一个 main.js 文件,这个文件就是打包的 js 文件
- 新建 index.html,导入打包的js文件:
<script src='./main.js'></script>
- 新建 index.html,导入打包的js文件:
entry 字段讲解
现在的目录是这样的:
- config
- client.config.js
- src
- client
- index.js
- client
- package-lock.json
- package.json
现在我需要在 client.config.js 中配置打包信息,其中遇到一个 entry 路径问题。
我写的是 ../src/client/index.js,报路径错误。
后面改为 ./src/client/index.js 就可以了。
查找了原因:
- config 目录和 src 目录是同级的,为什么 entry 是 ./ 而不是 ../?
- 因为 webpack 的 entry 是相对于配置文件的 webpack.config.js
- webpack 配置文件中的 entry 字段是相对于项目根目录的路径,而不是相对于配置文件本身
- 因此,无论配置文件在哪个目录下,entry 都应该是相对于项目根目录的路径。
- 所以这里的 ./src/client/index.js 是相对于项目根目录的路径。
html 文件自动引入打包文件
安装插件:
npm i -D html-webpack-plugin,这个插件会自动生成 HTML 文件,并将打包后的 JavaScript 和 CSS 文件自动插入到 HTML 中。新建 public 文件夹 和 index.html 文件,作为插件的模板 html 文件
修改 webpack.config.js 代码:
const HtmlWebpackPlugin = require('html-webpack-plugin') // 自动生成 HTML 文件的插件
module.exports = {
entry: { // 入口文件
main: './src/main.js'
},
output: { // 出口文件
path: __dirname + '/dist'
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html' // 作为生成 HTML 文件的模板文件
})
]
}修改 src/main.js 文件内容:
import { hello } from './hello.js' console.log(hello + ' world!!!')终端输入:
npm run build可以看到在 dist 文件夹中会自动生成 index.html
index.html 使用模板插件提供的 title
可以在 HtmlWebpackPlugin 中定义 title 信息
const HtmlWebpackPlugin = require('html-webpack-plugin') // 自动生成 HTML 文件的插件
module.exports = {
entry: { // 入口文件
main: './src/main.js'
},
output: { // 出口文件
path: __dirname + '/dist'
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html', // 作为生成 HTML 文件的模板文件
title: 'webpack-test'
})
]
}修改 public/index.html 的 title 标签内容:
<title><%= htmlWebpackPlugin.options.title %></title>终端输入:
npm run build可以在浏览器中看到标签页的 title 信息已经生效了,显示的:“webpack-test”
清除 dist 目录中的旧文件
安装插件:
npm i -D clean-webpack-plugin,此插件在每次打包前清除输出目录中的旧文件。避免打包后的旧文件残留在输出目录中,导致构建过程中的文件混乱或冗余。保持输出目录的整洁。修改 dist 文件夹中的 index.html 文件名为 index111.html
修改 webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin') // 自动生成 HTML 文件的插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin') // 打包前清除输出目录中的旧文件
module.exports = {
entry: { // 入口文件
main: './src/main.js'
},
output: { // 出口文件
path: __dirname + '/dist'
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html' // 作为生成 HTML 文件的模板文件
}),
new CleanWebpackPlugin()
]
}终端输入:
npm run build可以看到 dist 文件夹中的 index111.html 被删除,从新出现 index.html 文件。
配置 webpack 的 web 服务环境
- 此时的 webpack 是没有 web 服务环境的,可以使用
webpack-dev-server模块来启动 web 服务 - 安装:
npm i -D webpack-dev-server - 修改 package.json 中的 script 脚本,添加
"serve": "webpack-dev-server" - 终端输入:
npm run serve,就可以启动一个运行在 80 端口的服务了 - 此时的项目具有热更新,修改代码后不需要重新在终端进行启动
配置 sourcemap
- sourcemap 启动映射文件,可以通过浏览器查找原始的文件,这样对调试是非常有帮助的。
- 比如我们现在在 main.js 中输入一个错误代码,
console.log(a),a 是不存在的,肯定会报错。 
- 上面可以看到报错信息指向的是打包后的文件,对于我们调试来说很麻烦。
- 可以使用 sourcemap 来映射文件,帮助我们更好的找到错误的位置。
- 在 webpack.config.js 文件中添加如下代码:
devtool: 'inline-source-map' - 修改了 webpack.config.js 文件后记得重新启动项目:
npm run serve 
css 模块化
- 安装
css-loader和style-loader来支持 css 模块化 - 命令:
npm i -D css-loader style-loader - 在 webpack.config.js 中添加下面代码
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'] // 从右至左依次执行
}
]
} - 终端输入:
npm run serve - 去控制台查看 Elements 选项能够发现 body 类上加入了
* { margin: 0; padding: 0; }代码。
图片模块化
- 如果想让 webpack 支持图片模块化也需要相应的 loader,不过最新版本的 webpack 已经内置了对图片的处理。
- 只需要配置好信息即可实现对图片的模块化处理。
- 修改 webpack.config.js 代码
module: {
rules: [
{
test: /\.(png|gif|jpg|jpeg)/i,
type: 'asset/resource'
}
]
} - public/index.html 添加 img:
<img src="" alt=""> - main.js 添加:
import img from './assets/01.png'
const imgDom = document.querySelector('img')
imgDom.src = img - 终端输入:
npm run serve
处理单文件 .vue 文件
- 安装:
npm i -D vue vue-template-complier vue-loader- vue – 让 vue 功能生效
- vue-template-complier – 支持单文件组件
- vue-loader – 把单文件组件进行转换
- webpack.config.js 文件添加下面代码
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
module: {
rules: [
{
test: /\.vue$/i,
loader: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
} - 新建 src/App.vue 文件
<template>
<div class="greet" @click="clickHandler">{{ msg }}</div>
</template>
<script>
export default {
data() {
return {
msg: 'Hello World'
}
},
methods: {
clickHandler() {
alert('Hi Vue')
}
}
}
</script>
<style scoped>
.greet {
background-color: skyblue;
}
</style> - src/main.js 文件新增下面代码
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app') - pulic/index.html 新增下面代码:
<div id="app"></div> - 终端输入:
npm run serve,可以看到页面显示 “hello word”,并且背景为天蓝色。