背景

image.png

介绍

image.png

image.png

image.pngimage.png

======================

安装

https://www.yuque.com/yejielin/mypn47/amd38l#Nh7DY

=======================

配置/设置

image.png

通过命令(局限)

image.png

通过scripts(局限)

image.png

通过配置文件(常用)

webpack内置了一些配置,无需我们自己手动配置。

如果我们希望自己手动配置一些东西,就要在项目下创建一个 webpack.config.js 文件,这个就是webpack的配置文件。

webpack每次打包时,都会检查项目下有没有这个文件,没有的话就用默认配置,有的话就用这里的配置。

下面是一个最基本的 webpack.config.js 的例子:

  1. // ./src/webpack.config.js
  2. // 这个是nodejs的路径api,这里用于帮助我们得到绝对路径
  3. const path = require('path');
  4. // 这里是导出一个对象,对象的属性就是配置
  5. module.exports = {
  6. // 指定项目的js入口
  7. entry: "./src/main.js",
  8. // 指定打包输出后到哪个文件夹,默认是项目下的dist文件夹
  9. output: {
  10. // 这里提供nodejs的path 路径API,获取当前文件 webpack.config.js 所在文件夹的绝对路径,然后指向build文件夹
  11. // 意思是输出到项目下的build文件夹,而不是默认的dist
  12. path: path.resolve(__dirname, "./build"),
  13. // 指定输出后的文件名,默认就是bundle.js
  14. filename: "bundle.js"
  15. }
  16. }

如果我不想用 webpack.config.js 这个名字,想换一个,可以在package.json里的scripts里面设置
image.png

其他配置可以查看官网:
https://webpack.docschina.org/configuration/

=======================

入口

什么是入口?

就是整个项目js的入口,webpack需要一个入口,才能识别到哪些文件、代码需要打包,哪些不需要。

依赖图

image.png
也就是所有和主入口有关系的文件,都会被打包。

怎么产生关系?通过主入口引入的文件(如import、require等),以及后面再引入到这个文件的文件,这些都是。

这是一种图结构,文件和文件可能相互依赖,同时也会识别哪些已经加载过,不会重复打包

=======================

加载器 Loader

image.png
webpack 目前来说只是帮我们打包js文件,其他文件如.css是不认识的。

而通过安装一些加载器Loader,可以帮助webpack认识这些文件,并且一起打包。

如何使用Loader?

1、安装对应的loader,比如要处理和识别css,就要安装css-loader

  1. npm install loader名字 -D

2、给webpack添加对应loader的配置,告诉webpack怎么使用

  1. // ./src/webpack.config.js
  2. const path = require('path');
  3. module.exports = {
  4. entry: "./src/main.js",
  5. output: {
  6. path: path.resolve(__dirname, "./build"),
  7. filename: "bundle.js"
  8. },
  9. // 配置loader模块
  10. module: {
  11. rules: [ // 规则属性
  12. {}, // loader对应的配置
  13. {},
  14. ......
  15. {},
  16. ]
  17. }
  18. }

其他loader可以查看
https://www.yuque.com/yejielin/mypn47/whbit4#vsbnc

=======================

插件 Plugin

loader做不了的事情,webpack某个阶段想做的事情,都是通过插件完成(如自动删除文件)

loader只是处理webpack打包,而插件是在任何webpack生命周期都会起作用。
image.png

其他插件可以查看
https://www.yuque.com/yejielin/mypn47/zi1bzl#KXJzA

=======================

打包模式 Mode

背景

默认打包,是把所有js代码都拷贝到1个叫 bundle.js 的文件内,丑化和优化过的,只有1行。

但是缺点是,自己调试的时候,如果有个地方出错了,你很难找到到底是哪里出错了,因为都是只有1行,而且不会告诉你哪个位置(如下图)
image.png
image.png

开发模式(方便调试错误)

image.png
如果把mode设置成开发模式,那么打包出来的bundle.js 就是没有压缩和丑化的。
image.png
但结果还是看的有点吃力,这是因为devtool默认值是”eval”,把这个改为”source-map”就可以了。

会多一个 .js.map 的文件,这个是一个映射文件,意思是打包后的bundle.js 通过映射,映射到我们的源代码里面,这样就可以查看了。
image.png
image.png
image.png

其他选项

image.png

image.png

=======================

webpack中使用Vue

可查看 Vue - 在webpack里使用Vue3Vue - 编写Template的3种方式(Vue3)

=======================

自动编译、本地开发服务器

https://www.yuque.com/yejielin/mypn47/krxlh0

=======================

开发环境配置、生产环境配置

背景

image.png
比如开发的时候,配置是开发环境的,打包上生产环境的时候,还是用这套配置就不合适,但是不可能打包的时候把代码改成生产的,然后又改回开发的。

方案一:两个配置文件

编写两个不同的配置文件,开发和生成时,分别加载不同的配置文件即可;

1、创建文件

image.png

2、修改脚本

package.json中:
image.png

3、安装webpack-merge插件

  1. npm install webpack-merge -D

4、编写公共配置

把开发的配置和生成环境的配置抽出来放到对应的文件,这里只留下两边共有的

  1. // webpack.comm.config.js
  2. const path = require("path");
  3. const HtmlWebpackPlugin = require("html-webpack-plugin");
  4. const { DefinePlugin } = require("webpack");
  5. const { VueLoaderPlugin } = require('vue-loader/dist/index');
  6. module.exports = {
  7. target: "web",
  8. entry: "./src/main.js",
  9. output: {
  10. path: path.resolve(__dirname, "../build"), // 路径要调整一下
  11. filename: "js/bundle.js",
  12. },
  13. resolve: {
  14. extensions: [".js", ".json", ".mjs", ".vue", ".ts", ".jsx", ".tsx"],
  15. alias: {
  16. "@": path.resolve(__dirname, "../src"), // 路径要调整一下
  17. "js": path.resolve(__dirname, "../src/js") // 路径要调整一下
  18. }
  19. },
  20. module: {
  21. rules: [// 公共的规则],
  22. },
  23. plugins: [
  24. new HtmlWebpackPlugin({
  25. template: "./public/index.html",
  26. title: "哈哈哈哈"
  27. }),
  28. new DefinePlugin({
  29. BASE_URL: "'./'",
  30. __VUE_OPTIONS_API__: true,
  31. __VUE_PROD_DEVTOOLS__: false
  32. }),
  33. new VueLoaderPlugin()
  34. ],
  35. };

5、编写开发、生产配置文件

  1. // webpack.dev.config.js
  2. // 1、引入安装的webpack-merge
  3. const { merge } = require('webpack-merge');
  4. // 2、引入公共文件
  5. const commonConfig = require('./webpack.comm.config');
  6. // 3、用nodeJS的方式导出模块,merge函数就是合并两个配置的
  7. module.exports = merge(commonConfig, {
  8. mode: "development",
  9. devtool: "source-map",
  10. devServer: {
  11. contentBase: "./public",
  12. hot: true,
  13. // host: "0.0.0.0",
  14. port: 7777,
  15. open: true,
  16. // compress: true,
  17. proxy: {
  18. "/api": {
  19. target: "http://localhost:8888",
  20. pathRewrite: {
  21. "^/api": ""
  22. },
  23. secure: false,
  24. changeOrigin: true
  25. }
  26. }
  27. },
  28. })
  1. //webpack.prod.config.js
  2. const { CleanWebpackPlugin } = require("clean-webpack-plugin");
  3. const CopyWebpackPlugin = require('copy-webpack-plugin');
  4. // 1、引入安装的webpack-merge
  5. const {merge} = require('webpack-merge');
  6. // 2、引入公共文件
  7. const commonConfig = require('./webpack.comm.config');
  8. // 3、用nodeJS的方式导出模块,merge函数就是合并两个配置的
  9. module.exports = merge(commonConfig, {
  10. mode: "production",
  11. plugins: [
  12. new CleanWebpackPlugin(),
  13. new CopyWebpackPlugin({
  14. patterns: [
  15. {
  16. from: "./public",
  17. globOptions: {
  18. ignore: [
  19. "**/index.html"
  20. ]
  21. }
  22. }
  23. ]
  24. }),
  25. ]
  26. })

方案二:一个配置文件,设置参数

使用相同的一个入口配置文件,通过设置参数来区分它们;

===================

运行原理图

image.png

image.png