- 背景
- 介绍
- ======================
- 安装
- =======================
- 配置/设置
- =======================
- 入口
- 依赖图
- =======================
- 加载器 Loader
- =======================
- 插件 Plugin
- =======================
- 打包模式 Mode
- =======================
- webpack中使用Vue
- =======================
- 自动编译、本地开发服务器
- =======================
- 开发环境配置、生产环境配置
- ===================
- 运行原理图
背景

介绍


======================
安装
https://www.yuque.com/yejielin/mypn47/amd38l#Nh7DY
=======================
配置/设置
通过命令(局限)
通过scripts(局限)

通过配置文件(常用)
webpack内置了一些配置,无需我们自己手动配置。
如果我们希望自己手动配置一些东西,就要在项目下创建一个 webpack.config.js 文件,这个就是webpack的配置文件。
webpack每次打包时,都会检查项目下有没有这个文件,没有的话就用默认配置,有的话就用这里的配置。
下面是一个最基本的 webpack.config.js 的例子:
// ./src/webpack.config.js// 这个是nodejs的路径api,这里用于帮助我们得到绝对路径const path = require('path');// 这里是导出一个对象,对象的属性就是配置module.exports = {// 指定项目的js入口entry: "./src/main.js",// 指定打包输出后到哪个文件夹,默认是项目下的dist文件夹output: {// 这里提供nodejs的path 路径API,获取当前文件 webpack.config.js 所在文件夹的绝对路径,然后指向build文件夹// 意思是输出到项目下的build文件夹,而不是默认的distpath: path.resolve(__dirname, "./build"),// 指定输出后的文件名,默认就是bundle.jsfilename: "bundle.js"}}
如果我不想用 webpack.config.js 这个名字,想换一个,可以在package.json里的scripts里面设置
其他配置可以查看官网:
https://webpack.docschina.org/configuration/
=======================
入口
什么是入口?
就是整个项目js的入口,webpack需要一个入口,才能识别到哪些文件、代码需要打包,哪些不需要。
依赖图

也就是所有和主入口有关系的文件,都会被打包。
怎么产生关系?通过主入口引入的文件(如import、require等),以及后面再引入到这个文件的文件,这些都是。
这是一种图结构,文件和文件可能相互依赖,同时也会识别哪些已经加载过,不会重复打包
=======================
加载器 Loader

webpack 目前来说只是帮我们打包js文件,其他文件如.css是不认识的。
而通过安装一些加载器Loader,可以帮助webpack认识这些文件,并且一起打包。
如何使用Loader?
1、安装对应的loader,比如要处理和识别css,就要安装css-loader
npm install loader名字 -D
2、给webpack添加对应loader的配置,告诉webpack怎么使用
// ./src/webpack.config.jsconst path = require('path');module.exports = {entry: "./src/main.js",output: {path: path.resolve(__dirname, "./build"),filename: "bundle.js"},// 配置loader模块module: {rules: [ // 规则属性{}, // loader对应的配置{},......{},]}}
其他loader可以查看
https://www.yuque.com/yejielin/mypn47/whbit4#vsbnc
=======================
插件 Plugin
loader做不了的事情,webpack某个阶段想做的事情,都是通过插件完成(如自动删除文件)
loader只是处理webpack打包,而插件是在任何webpack生命周期都会起作用。
其他插件可以查看
https://www.yuque.com/yejielin/mypn47/zi1bzl#KXJzA
=======================
打包模式 Mode
背景
默认打包,是把所有js代码都拷贝到1个叫 bundle.js 的文件内,丑化和优化过的,只有1行。
但是缺点是,自己调试的时候,如果有个地方出错了,你很难找到到底是哪里出错了,因为都是只有1行,而且不会告诉你哪个位置(如下图)

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

如果把mode设置成开发模式,那么打包出来的bundle.js 就是没有压缩和丑化的。
但结果还是看的有点吃力,这是因为devtool默认值是”eval”,把这个改为”source-map”就可以了。
会多一个 .js.map 的文件,这个是一个映射文件,意思是打包后的bundle.js 通过映射,映射到我们的源代码里面,这样就可以查看了。


其他选项

=======================
webpack中使用Vue
可查看 Vue - 在webpack里使用Vue3 和 Vue - 编写Template的3种方式(Vue3)
=======================
自动编译、本地开发服务器
https://www.yuque.com/yejielin/mypn47/krxlh0
=======================
开发环境配置、生产环境配置
背景

比如开发的时候,配置是开发环境的,打包上生产环境的时候,还是用这套配置就不合适,但是不可能打包的时候把代码改成生产的,然后又改回开发的。
方案一:两个配置文件
编写两个不同的配置文件,开发和生成时,分别加载不同的配置文件即可;
1、创建文件

2、修改脚本
package.json中:
3、安装webpack-merge插件
npm install webpack-merge -D
4、编写公共配置
把开发的配置和生成环境的配置抽出来放到对应的文件,这里只留下两边共有的
// webpack.comm.config.jsconst path = require("path");const HtmlWebpackPlugin = require("html-webpack-plugin");const { DefinePlugin } = require("webpack");const { VueLoaderPlugin } = require('vue-loader/dist/index');module.exports = {target: "web",entry: "./src/main.js",output: {path: path.resolve(__dirname, "../build"), // 路径要调整一下filename: "js/bundle.js",},resolve: {extensions: [".js", ".json", ".mjs", ".vue", ".ts", ".jsx", ".tsx"],alias: {"@": path.resolve(__dirname, "../src"), // 路径要调整一下"js": path.resolve(__dirname, "../src/js") // 路径要调整一下}},module: {rules: [// 公共的规则],},plugins: [new HtmlWebpackPlugin({template: "./public/index.html",title: "哈哈哈哈"}),new DefinePlugin({BASE_URL: "'./'",__VUE_OPTIONS_API__: true,__VUE_PROD_DEVTOOLS__: false}),new VueLoaderPlugin()],};
5、编写开发、生产配置文件
// webpack.dev.config.js// 1、引入安装的webpack-mergeconst { merge } = require('webpack-merge');// 2、引入公共文件const commonConfig = require('./webpack.comm.config');// 3、用nodeJS的方式导出模块,merge函数就是合并两个配置的module.exports = merge(commonConfig, {mode: "development",devtool: "source-map",devServer: {contentBase: "./public",hot: true,// host: "0.0.0.0",port: 7777,open: true,// compress: true,proxy: {"/api": {target: "http://localhost:8888",pathRewrite: {"^/api": ""},secure: false,changeOrigin: true}}},})
//webpack.prod.config.jsconst { CleanWebpackPlugin } = require("clean-webpack-plugin");const CopyWebpackPlugin = require('copy-webpack-plugin');// 1、引入安装的webpack-mergeconst {merge} = require('webpack-merge');// 2、引入公共文件const commonConfig = require('./webpack.comm.config');// 3、用nodeJS的方式导出模块,merge函数就是合并两个配置的module.exports = merge(commonConfig, {mode: "production",plugins: [new CleanWebpackPlugin(),new CopyWebpackPlugin({patterns: [{from: "./public",globOptions: {ignore: ["**/index.html"]}}]}),]})
方案二:一个配置文件,设置参数
使用相同的一个入口配置文件,通过设置参数来区分它们;
===================
运行原理图


