版本要求
node
版本需要18及以上,否则下载最新的webpack
一些包,运行起来会出问题
npm
版本一般都是跟随node
的
建议
最好是可以利用nvm
来对你电脑的node
版本进行管理
如何查看版本
调出来你的cmd
工具
按键:Win+R
查看node版本
得到版本为V 18.18.2
查看npm版本
得到版本为V 9.8.1
注意
本章节前置知识点、优化点大部分均在[Webapck创建Vue3项目](https://wutiaowu5t5.github.io/posts/54d94922/)这里
一、新建项目
新建一个项目,并在编辑器里面打开,这里用的是Webstorm
,项目名字是WebpackCreateReact
二、初始化项目
打开终端, 运行下面这段命令,会给我们的项目初始化,生成一个package.json
文件
三、搭建项目
这一步将要实现目标就是:
- 给
webpack
区分打包环境
- 给项目添加
React
- 给项目添加
css
预处理器
- 把项目跑起来
3.1-Webpack基础包
执行下面这段命令,我们就可以启动webpack
项目了,这些包在使用Webpack
进行项目构建时常用到的
1
| npm install webpack-dev-server webpack webpack-cli webpack-merge --save-dev
|
这时候我们看到到项目里面多出来了一个目录node_modules
,一个文件package-lock.json
,package.json
里面多出来了一个devDependencies
3.2-配置文件
项目内创建webpackConfig
目录,用来保存和webpack
相关的配置文件,和项目文件分离出来
webpack.common.js
公共配置文件
配置模块解析规则 resolve
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
const path = require('path')
module.exports = { resolve: { extensions: [ '.js', '.ts', '.json', '.tsx', '.css', '.less' ], alias: { '@': path.resolve(__dirname, '../src'), 'cmp': path.resolve(__dirname, '../src/components'), 'api': path.resolve(__dirname, '../src/api') } }, }
|
配置入口文件entry
1 2 3 4 5 6
| module.exports = { ... other code ... entry: path.resolve(__dirname, '../src/main.tsx'), ... other code ... }
|
配置输出选项output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| module.exports = { ... other code ... output: { filename: '[name].[chunkhash:8].js', path: path.resolve(__dirname, '../dist'), asyncChunks: true, publicPath: '/', clean: true }, ... other code ... }
|
在Webpack配置中,output
属性告诉Webpack如何写出它所创建的bundles(打包后的文件),以及在哪里写出它们
这个属性定义了打包过程生成的文件的输出方式和位置
它的配置对于确定你打包后的资源如何分发和使用至关重要
定义模块的规则配置module
1 2 3 4 5 6 7 8 9 10 11
| module.exports = { ... other code ... module: { rules: [ ] }, ... other code ... }
|
写好之后进行下一步操作,后续随着配置增加,会给这个rules数组添加新东西
插件配置数组plugins
1 2 3 4 5 6 7 8 9
| module.exports = { ... other code ... plugins: [ ] ... other code ... }
|
写好之后进行下一步操作,后续随着配置增加,会给这个数组添加新东西
webpack.dev.js
开发环境配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
const { merge } = require("webpack-merge") const base = require("./webpack.common.js")
module.exports = merge(base, { mode: 'development', devtool: "source-map", devServer: { compress: true, port: 3000, hot: true, open: true, historyApiFallback: true, client: { progress: true, logging: 'error', overlay: { errors: true, warnings: true } }, proxy: { "/apis": { target: "your-target-url", pathRewrite: {"^/apis": "" }, changeOrigin: true, secure: false } } } })
|
这段代码使用 webpack-merge
工具来合并基础的Webpack配置和开发环境特定的配置,生成一个适用于开发环境的Webpack配置对象
webpack.pros.js
生产环境配置文件
1 2 3 4 5 6 7 8 9 10 11
| const path = require('path') const { merge } = require("webpack-merge") const base = require("./webpack.common.js")
module.exports = merge(base, { mode: 'production', plugins: [ ] })
|
修改script启动项目命令
运行这段命令,安装cross-env
包,用于设置跨平台环境变量,通常用于设置NODE_ENV等环境变量
1
| npm install cross-env --save-dev
|
然后修改package.json
文件的script
1 2 3 4
| "scripts": { "dev": "cross-env NODE_ENV=development webpack serve --config ./webpackConfig/webpack.dev.js", "build": "cross-env NODE_ENV=production webpack --config ./webpackConfig/webpack.prod.js" },
|
3.3-React系列
安装React
全家桶
1
| npm install react react-dom
|
新建src文件
这个目录是我们React
项目的主要存放地方,所有Vue
的东西都是包含在这里面的
新建assets
这个目录主要存放我们的资源:图片、字体、css
新建apis
这个目录主要存放我们的接口,分成不同的模块js文件去存放对应的接口
新建utils
这个目录主要存放我们的一些公共函数
新建hooks
这个目录主要存放我们的一些hooks函数
新建components
这个目录主要存放我们的公共组件
新建store
这个目录是要存放公共状态管理,是pinia
的使用入口
新建pages
这个目录存放项目的React
主要页面
新建main.tsx
这个文件是Webpack的项目入口,也是React
的实例创建文件
1 2 3 4 5 6 7 8
| import React from 'react' import { createRoot } from 'react-dom/client' import App from './App';
const root = document.getElementById('root') if(root) { createRoot(root).render(<App />) }
|
新建App.tsx
1 2 3 4 5 6
| import React from 'react'
function App() { return <h2>webpack5-react-ts</h2> } export default App
|
安装Ts类型依赖
1
| npm i @types/react @types/react-dom babel-loader @babel/core @babel/preset-react @babel/preset-typescript -D
|
修改webpack.common.js
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| module.exports = { module: { rules: [ { test: /.(ts|tsx)$/, use: { loader: 'babel-loader', options: { presets: [ '@babel/preset-react', '@babel/preset-typescript' ] } } } ] } }
|
新增tsconfig.json文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| { "compilerOptions": { "target": "ESNext", "lib": ["DOM", "DOM.Iterable", "ESNext"], "allowJs": false, "skipLibCheck": false, "esModuleInterop": false, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", "moduleResolution": "Node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, "jsx": "react", "baseUrl": ".", "paths": { "@/*": [ "src/*" ], "@cmp/*": [ "src/components/*" ], "@api/*": [ "src/apis/*" ], "@utils/*": [ "src/utils/*" ] } }, "include": ["./src"] }
|
到此为止的目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ├─node_modules ├─src │ ├─apis // 项目接口 │ ├─assets // css、图片、字体资源 │ │ ├─css │ │ ├─fonts │ │ └─images │ ├─components // 公共组件 │ ├─directive // 自定义指令 │ ├─hooks // hooks函数 │ ├─router // 路由管理 │ ├─store // Pinia状态管理 │ │ └─modules │ ├─utils // 公共工具函数 │ └─pages // 项目页面 │ ├─Home │ └─Login └─webpackConfig // webpack公共、开发、生产配置
|
指定html文件
在项目的根目录下面新建一个index.html
文件,内容如下
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Webpack Create React</title> </head> <body> <div id="root"></div> </body> </html>
|
接着运行这段命令,安装一下html-webpack-plugin
1
| npm install html-webpack-plugin --save-dev
|
这个插件可以帮助我们将打包好的文件都引入到index.html
里面,不再需要我们自己手动去引入
修改webpack.common.js
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = { ... other code ... plugins: [ new HtmlWebpackPlugin({ template: './index.html', filename: './index.html', title: 'Vue3 + webpack -> Web App', minify: { collapseWhitespace: true, removeComments: true } }), ] ... other code ... }
|
测试运行
控制台输入npm run dev
这时候编辑器会自动在打包好以后给你在浏览器打开端口3000的地址
3.4-样式系列
在前端工程化里面,常用的预编译的css
就是less
、scss
、sass
,这里我们选用less
来作为项目的预编译器
1
| npm install css-loader style-loader less-loader less --save-dev
|
修改webpack.common.js
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| module.exports = { ... other code ... module: { rules: [ { test: /\.css$/, use: [ "style-loader", "css-loader" ] }, { test: /\.less$/, use: [ "style-loader", "css-loader", "less-loader" ] }
] },
... other code ... }
|
四、优化项目
4.1-静默样式热更新
1
| npm i @pmmmwh/react-refresh-webpack-plugin react-refresh -D
|
修改webpack.dev.js
文件
1 2 3 4 5 6 7 8 9
| const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = merge(baseConfig, { plugins: [ new ReactRefreshWebpackPlugin(), ] })
|
五、源代码