简介这份 Vue3-demo 面向希望快速上手 Vue3 新语法与组件库集成的开发者尤其适合想了解 Element-Plus 引入方式、Mockjs 假数据配置和 axios 请求封装的初中级前端学习者。工程已完成环境搭建与依赖安装解压后即可进入开发省去从零初始化项目、反复调试引入顺序的麻烦。压缩包共 27 个文件、约 130KB以 9 个 .vue 单文件组件为核心配合 3 个 .js 与 1 个 .cjs 文件承载入口和构建配置多个 .json 管理依赖与编辑器设置另有 .css、.md 说明文档及 png、svg、ico 等静态资源结构清晰、体量轻巧便于直接阅读和二次改造。目前已有 2140 人学习对入门者具有较好的参考价值。工程内已用 Element-Plus 的 table 组件搭好可运行的表格页面可直接作为新页面的脚手架同时保留 Mockjs 与 axios 的接入示例方便对照理解假数据如何生成、请求如何发出并据此扩展列表、表单等常见业务模块。1. 解开压缩包就有 node_modules第一次 npm run dev 照样可能失败拿到的压缩包解开node_modules就躺在里面package.json里vue、element-plus、mockjs一个不少看着就是那种「环境已配好、拿来就能跑」的 Vue3 项目。真上手敲npm run dev出问题的地方往往不在业务代码Node 版本差一个大版本Vite 直接甩一句crypto.hash is not a functionpnpm 和 npm 的 lock 文件混着用装出两份 Vue页面白屏而控制台却不报错mockjs 规则写得挺像回事接口却照样打到真后端。Vue3 Element-Plus mockjs 这套组合横跨运行时、构建工具、组件库和请求拦截四层任何一层没对齐表现都是「跑不起来」。下面按我平时装这套骨架的顺序走先定 Node 和包管理器再装依赖启动然后把 Element-Plus 按需引入和 mock 拦截配到位最后给验证和排错的路子。适合拿到这套 demo 想直接跑通的人也适合想把它改成自己项目底座的人。2. 环境底座Node 版本、包管理器与依赖清单三件事这套 demo 号称「环境已配好」指的是代码层面配好了运行机器上的东西还是得自己对齐。我见过太多人把压缩包拷到另一台电脑解压、npm install、npm run dev三步走完然后卡在第一个报错上半天。问题几乎都集中在三处Node 大版本、包管理器与 lock 文件、依赖到底装在哪一层。这一章先把这三件事定下来后面装机才顺。2.1 Node 版本和 Vite 的对应关系Vue 3 本身对 Node 没那么挑真正挑的是 Vite。Vue3 Element-Plus 这套骨架基本都用 Vite 做构建而 Vite 每个大版本对 Node 有硬性下限低于下限不是警告是直接起不来。常见对应关系我整理成下面这张表拿到项目先看package.json里vite的版本范围再对照机器上的 NodeVite 版本Node 最低要求常见报错Vite 4.x14.18 / 16Cannot find module node:...Vite 5.x18.0 / 20crypto.hash is not a functionVite 6.x18.0 / 20 / 22SyntaxError: Unexpected token ?类似语法错先查现场# 看当前 Node 与 npm 版本两个都要看 node -v npm -v # 如果项目根目录有 .nvmrc直接按文件切 cat .nvmrc nvm usenode -v出来是v16.x而package.json里写的是vite: ^5.2.0那就别挣扎了升 Node。Vite 5 内部用了 Node 18 才稳定的crypto.hash在 16 上运行会直接抛TypeError: crypto.hash is not a function这个报错跟业务代码一点关系没有纯运行时版本问题。我一般统一用 Node 20.x 的 LTS 版本Vite 4/5/6 都能覆盖切版本用 nvm 最省事别去手动改系统 PATH。还有一点容易忽略package.json里的engines字段只是声明npm 默认不强制。想让它真拦住在项目根目录加一个.npmrc# 装依赖时强制校验 engines版本不符直接失败而不是装完才发现 engine-stricttrue加了这行Node 版本不对时npm install阶段就会报Unsupported engine比等到npm run dev才发现要早得多。当然如果你接手的是别人机器上已经装好的node_modules切完 Node 版本记得把node_modules删掉重装因为部分依赖带原生模块比如 sass 的二进制跨 Node 大版本复用会出些莫名其妙的加载错误。2.2 npm 还是 pnpmlock 文件别乱删第二个高频出错点是包管理器混用。压缩包里如果带着pnpm-lock.yaml说明原作者用 pnpm 装的。你顺手一个npm installnpm 不认识 pnpm 的 lock会自己解析package.json重新算一遍依赖树生成一份package-lock.json。两个 lock 文件并存下一次谁先跑就用谁的规则装出来的node_modules结构可能不一样。最典型的后果是「两份 Vue」Element-Plus 依赖的 Vue 和你业务代码里的 Vue 版本解析到两个不同路径运行时组件注册不上页面白屏控制台只给你一句Cannot read properties of null (reading isCE)新手看到这句基本无从下手。判断方法很直接# 看 vue 被安装了几份、分别在哪里 npm ls vue # 或 pnpm 项目 pnpm why vue输出里如果出现两个不同版本的vue3.x就是重复安装。处理办法是把node_modules和多余的 lock 一起清掉只保留一种# 三个 lock 文件只留一个按你实际用的包管理器选 rm -rf node_modules rm -f package-lock.json yarn.lock pnpm-lock.yaml # 假设原项目用 pnpm就装回 pnpm 再执行 pnpm install另一种情况是 pnpm 的严格依赖模式。npm 会把依赖拍平你代码里import一个没在package.json声明的包也能跑幽灵依赖pnpm 默认不拍平同样的代码会报Module not found。遇到这种不要急着关掉严格模式先看这个包是不是真的该被显式声明。真要临时兼容在.npmrc里加shamefully-hoisttrue但这属于兜底长期还是补齐依赖声明更干净。2.3 依赖清单核对Vue3、Element-Plus、mockjs 各在哪一层装之前把package.json过一遍重点看依赖分在dependencies还是devDependencies。分错了不影响开发跑但会影响打包体积和 CI 安装策略。我按这套骨架的常见构成列一张表包名常见版本范围放哪一层作用vue^3.3 / ^3.4dependencies运行时核心vue-router^4.xdependencies路由pinia^2.xdependencies状态管理element-plus^2.7dependencies组件库element-plus/icons-vue^2.xdependencies图标axios^1.xdependencies请求mockjs^1.1.0devDependencies假数据生成vite-plugin-mock^3.xdevDependenciesmock 服务插件unplugin-auto-import^0.17devDependencies自动导入unplugin-vue-components^0.26devDependencies组件按需注册sass^1.xdevDependencies主题定制需要mockjs和vite-plugin-mock放 devDependencies 是对的它们只在开发期起作用不该进生产包。但要注意有些模板为了图省事把mockjs写进 dependencies打包时如果代码里还有import Mock from mockjs的静态引用就会被打进产物体积白涨几十 KB。核对完执行一次安装再用下面的命令确认关键包都到位# 确认三个核心包的实际安装版本避免 lock 里锁的是旧版 npm ls vue element-plus mockjs # 查看某个包为什么被装进来排查重复依赖时很有用 npm explain vue版本这块有个取舍Element-Plus 2.x 要求 Vue 3.2 以上如果你的vue写的是^3.0.0npm 会装最新的 3.x通常没事但如果 lock 文件把 Vue 锁在 3.1.xElement-Plus 的部分组件会报渲染错误。稳妥做法是显式写vue: ^3.4.0这类下限明确的版本别留^3.0.0这种过宽的范围。3. 安装与首次启动从解压到页面出来底座定完进入实际安装。这一章的目标很明确让npm run dev起来浏览器能看到页面。听着简单实际卡人的地方集中在目录结构认错、镜像源和网络、环境变量加载顺序三处。我习惯按「先看再删、再装、再看日志」的节奏走比一上来就npm install稳。3.1 解压后先看目录别急着删 node_modules解压完先别动文件花两分钟看目录。这套 Vue3 Element-Plus mockjs 骨架的典型结构长这样vue3-demo/ ├── mock/ # mockjs 假数据规则通常一个模块一个文件 ├── public/ ├── src/ │ ├── api/ # 请求封装 │ ├── components/ │ ├── views/ │ ├── App.vue │ └── main.ts ├── .env.development # 开发环境变量 ├── .env.production # 生产环境变量 ├── index.html ├── package.json ├── tsconfig.json └── vite.config.ts # 构建配置mock 和 alias 都在这先看package.json的scripts段确认启动命令到底叫什么{ scripts: { dev: vite, build: vue-tsc --noEmit vite build, preview: vite preview } }有的模板把dev写成serve或者加了--mode dev照着敲npm run dev会报Missing script: dev不是环境问题就是命令名对不上。接着看vite.config.ts里有没有server.port如果写死了 3000那启动日志里就不是默认的 5173别拿着 5173 一直刷新。压缩包里自带的node_modules要不要留我的习惯是删。原因有两个一是它可能是在别人的系统上装的原生模块sass、esbuild 的二进制跟当前系统不一定匹配二是它可能带着过期的依赖树重装一遍反而最快。删之前先确认 lock 文件在没有 lock 的话先跑一次安装生成之后再删。# 先确认有 lock 文件再删 node_modules顺序别反 ls package-lock.json pnpm-lock.yaml 2/dev/null rm -rf node_modules3.2 装依赖镜像源、缓存与 lock 文件的处理安装阶段最集中的问题是网络。npm 官方源在国内拉包经常超时表现是装到一半卡住或者报ETIMEDOUT、ECONNRESET。常规做法是换镜像源项目级配置写在根目录.npmrc比改全局配置更可控# 项目级镜像源跟着仓库走换机器不用重配 registryhttps://registry.npmmirror.com # 原生模块的二进制也走镜像否则 sass 这类包还会去外网拉 sass_binary_sitehttps://registry.npmmirror.com/-/binary/node-sass # 安装失败重试次数网络抖动时能少挂几次 fetch-retries3 fetch-retry-maxtimeout60000配置完直接装# 有 lock 用 ci 更稳它严格按 lock 安装不会偷偷升级版本 npm ci # 没有 lock 或要更新依赖时才用 install npm installnpm ci和npm install的区别值得说清楚ci会先删掉node_modules再按 lock 文件精确安装装出来的版本和原作者一致适合「拿到别人的项目先跑起来」这个场景install会根据package.json的范围解析版本可能装出比 lock 里更新的包适合你确实要升级依赖的时候。第一次跑通我一般用ci。装的过程中如果卡在某个包上先看它是纯 JS 还是带二进制。纯 JS 包卡住基本是网络重试或换源即可带二进制的包sass、esbuild、sharp报错信息里通常带平台信息比如Unsupported platform for esbuild这种是平台不匹配或者镜像上没有对应产物删掉node_modules和 lock 重装一次往往就好。还有一个隐性坑是缓存损坏表现是某个包反复装失败但报错看不懂可以强制清缓存# 清掉 npm 缓存后重装缓存损坏时的后悔药 npm cache verify npm cache clean --force rm -rf node_modules npm ci3.3 dev 脚本、端口与环境变量文件的加载顺序依赖装完npm run dev。Vite 启动很快日志里会打出本地地址和网络地址。这一步要确认三件事端口、.env文件有没有被加载、有没有启动报错但被刷过去。端口在vite.config.ts里配// vite.config.ts 片段端口、host 与自动打开 export default defineConfig({ server: { host: 0.0.0.0, // 局域网其他设备也能访问方便真机调试 port: 5173, // 端口被占用时 Vite 会自动 1看日志确认实际端口 open: true, // 启动后自动开浏览器省一次手点 }, })host: 0.0.0.0这个配置在只用本机浏览器时无所谓但用手机连同一个 Wi-Fi 调试移动端页面时必须有否则网络地址那一行根本不会出现。port被占用时 Vite 不会报错而是自动换一个日志里会写Port 5173 is in use, trying another one...这时候你按记忆访问 5173 会看到别的项目别怀疑自己装错了。环境变量的加载顺序是另一个容易出错的地方。Vite 按mode加载.env、.env.local、.env.[mode]、.env.[mode].local后面的覆盖前面的。只有VITE_开头的变量才会注入到客户端代码里其他前缀的一律拿不到这是很多人写API_URL然后import.meta.env.API_URL拿到undefined的原因。# .env.development开发环境专用必须 VITE_ 前缀才会被前端读到 VITE_APP_TITLEvue3-demo VITE_APP_BASE_API/api # mock 开关1 开启 0 关闭后面 mock 章节会用 VITE_USE_MOCK1代码里这样读// 读取环境变量注意 import.meta.env 是编译期替换不是运行时对象 const baseApi import.meta.env.VITE_APP_BASE_API const useMock import.meta.env.VITE_USE_MOCK 1要注意import.meta.env.VITE_USE_MOCK拿到的永远是字符串写 1判断别直接当布尔用0在 JS 里是真值这个错我见过不止一次。启动日志里如果看到VITE v5.x ready in xxx ms并且没有红色报错页面也能出内容这一章就算过了。4. 组件库与假数据Element-Plus 按需引入搭 mockjs 拦截页面能起来只是第一步。这套骨架的价值在于 Element-Plus 提供了现成组件mockjs 提供了不依赖后端的假数据两者配好之后才能真正开始写业务。这一章把 Element-Plus 的引入方式、自动导入插件、mock 规则配置和开关隔离一次讲清都是可以直接抄进项目的写法。4.1 Element-Plus 全量引入与按需引入的取舍引入 Element-Plus 有两种方式先看全量// main.ts全量引入简单但会把整个组件库打进包 import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css // 样式必须单独引漏了组件会没样式 import App from ./App.vue const app createApp(App) app.use(ElementPlus) app.mount(#app)全量的优点是省心所有组件、指令、样式都注册好了写出el-table就能渲染缺点是打包体积大即使你只用了三个组件整个库也会进去。开发期无所谓上线前这股体积会变成实打实的首屏时间。按需引入解决这个问题原理是在构建时分析模板里用到的组件标签只把对应的组件和样式引进来。手写按需引入是可行的每个页面都写一堆import { ElButton } from element-plus但维护成本高。常规做法是用unplugin-vue-components加unplugin-auto-import两个插件自动完成。我的取舍是demo 练习、内部工具可以用全量正式项目一律按需两者不要在同一个项目里混着来混用会出现组件注册两次、样式重复注入的问题。4.2 unplugin-auto-import 与 unplugin-vue-components 的配置写法先装插件# 两个插件都是开发期依赖生产构建时会参与打包分析 npm i -D unplugin-auto-import unplugin-vue-components然后改vite.config.ts// vite.config.tsElement-Plus 按需自动导入 import { defineConfig } from vite import vue from vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite import Components from unplugin-vue-components/vite import { ElementPlusResolver } from unplugin-vue-components/resolvers export default defineConfig({ plugins: [ vue(), AutoImport({ // 自动导入 vue、vue-router、pinia 的 APIref、computed 不用手写 import imports: [vue, vue-router, pinia], // Element-Plus 的方法类 API比如 ElMessage、ElMessageBox 自动引入 resolvers: [ElementPlusResolver()], // 生成类型声明文件TS 项目必须有否则编辑器一片红 dts: src/auto-imports.d.ts, }), Components({ // 模板里写 el-button 时自动注册对应组件 resolvers: [ElementPlusResolver()], dts: src/components.d.ts, }), ], })AutoImport管的是 JS 里的 API比如你写ElMessage.success(ok)不用 importComponents管的是模板里的标签写el-table不用注册。两个dts选项生成声明文件TypeScript 才能认出这些自动导入的符号不然编辑器会标红但运行正常属于典型的「看着像错其实没错」。配完之后要把main.ts里的全量引入删掉否则两套机制打架// main.ts按需引入后不再 app.use(ElementPlus) import { createApp } from vue import App from ./App.vue const app createApp(App) app.mount(#app)有一个细节要提醒ElMessage、ElLoading这类通过函数调用的组件样式不会自动跟着走因为它们不在模板里插件分析不到。稳妥做法是在main.ts里显式引一次它们的样式// 函数式调用的组件样式需要手动引否则弹窗出来是白板 import element-plus/theme-chalk/el-message.css import element-plus/theme-chalk/el-loading.css如果项目要用 SCSS 定制主题ElementPlusResolver要加importStyle: sass同时装sass依赖并且vite.config.ts里配css.preprocessorOptions.scss.additionalData引入变量文件。这条路能改主题色但配置项多一层新手先跑通默认样式再动主题别一上来就两个变量一起改。4.3 mockjs 与 vite-plugin-mock 的规则配置mock 这块有两种做法一种是在代码里手动Mock.mock(url, template)拦截 XHR另一种是用vite-plugin-mock在 dev server 层拦请求。前者对 axios 的适配偶尔有问题且不好做路径匹配后者直接挂在 Vite 的中间件上请求在到达浏览器之前就被接管更干净。我一般用后者。# mockjs 提供数据模板插件负责挂载拦截 npm i -D mockjs vite-plugin-mock配置分两步先在vite.config.ts里挂插件// vite.config.tsmock 插件配置 import { viteMockServe } from vite-plugin-mock export default defineConfig({ plugins: [ // ...其他插件 viteMockServe({ mockPath: mock, // mock 文件所在目录相对项目根目录 enable: true, // 开发环境开启 logger: true, // 请求命中 mock 时在终端打日志排查很有用 }), ], })再写 mock 文件一个模块一个文件放在mock/下// mock/user.ts用户列表假数据路径要和前端请求的 url 完整匹配 import type { MockMethod } from vite-plugin-mock export default [ { url: /api/user/list, // 必须和 axios 的 baseURL 路径拼出来一致 method: get, response: ({ query }) { const page Number(query.page) || 1 return { code: 200, data: { total: 42, // mockjs 语法list|10 表示生成 10 条数组 list|10: [{ id|1: 1, name: cname, // 随机中文名 email: email, age|18-60: 1, createTime: datetime, }], page, }, } }, }, ] as MockMethod[]这里的坑集中在url上。mock 的匹配是完整路径匹配你前端 axios 配了baseURL: /api请求写request.get(/user/list)实际发出的是/api/user/listmock 里就得写全/api/user/list写/user/list是命中不了的。list|10是 mockjs 的模板语法竖线后面的数字是生成条数id|1: 1是自增cname、email这些是占位符会替换成随机内容。response函数能拿到query、body做分页和搜索的模拟够用了。4.4 用环境变量把 mock 关在生产之外mock 规则写完最危险的一件事是它跟着打包上线。表现是线上环境接口本该报错的地方返回了一堆假数据用户看到的是测试内容。根因是开关写死了// 错误写法enable 恒为 true生产构建也会注入 mock 中间件 viteMockServe({ enable: true })正确做法是让开关跟着环境变量走。viteMockServe的enable参数接收布尔值在配置文件里可以读process.env因为vite.config.ts跑在 Node 环境// vite.config.ts按启动模式决定是否启用 mock import { defineConfig, loadEnv } from vite export default defineConfig(({ mode }) { // 第三个参数传空字符串加载全部变量而不只是 VITE_ 前缀的 const env loadEnv(mode, process.cwd(), ) return { plugins: [ viteMockServe({ mockPath: mock, // 只有开发模式且显式开启时才挂 mock enable: mode development env.VITE_USE_MOCK 1, }), ], } })loadEnv(mode, process.cwd(), )这行的第三个参数容易写错。默认只加载VITE_前缀的变量传空字符串才加载全部而process.env.VITE_USE_MOCK在配置文件里不一定能直接读到因为 Vite 还没把 env 注入进去。用loadEnv显式读取是稳妥写法。前端请求层也要配套判断避免 mock 关掉之后请求还指向不存在的地址// src/api/request.tsaxios 实例的基础配置 import axios from axios const request axios.create({ // 从环境变量取开发环境是 /api生产环境换成真实网关 baseURL: import.meta.env.VITE_APP_BASE_API, timeout: 10000, }) export default request.env.production里把VITE_APP_BASE_API写成真实接口前缀VITE_USE_MOCK写0。这样npm run build出来的包里既没有 mock 数据请求也会走到真实后端。验证方法很简单构建后在dist里搜一下mockjs的痕迹搜不到就说明没打进去。5. 避坑与排查这套组合出问题的五个高频点前面按正常路径走了一遍但实际装的时候不会这么顺。这一章列五个我踩过或者帮人排查过的具体问题每个都按「现象 → 原因 → 解决」写遇到对得上的直接照方抓药。5.1 依赖与版本类问题现象一npm run dev直接报TypeError: crypto.hash is not a function一行业务代码都没执行。原因是 Node 版本低于 Vite 的要求。Vite 5 起用了 Node 18 才有的crypto.hashNode 16 上跑必然抛这个错。解决是把 Node 升到 18 以上我一般用 20.x LTS切完版本删掉node_modules重装# 切版本后必须重装原生模块跟 Node 版本绑定 nvm install 20 nvm use 20 rm -rf node_modules npm ci现象二页面白屏控制台报Cannot read properties of null (reading isCE)或者组件渲染异常但定位不到代码。原因是装出了两份 Vue。常见于 lock 文件混用或者某个依赖自己带了一份 Vue。先用npm ls vue确认如果输出里出现两个路径就清干净重装只留一种包管理器和一份 lock 文件。如果是某个第三方库强依赖旧版 Vue用package.json的overrides强制统一版本{ overrides: { vue: $vue } }$vue表示跟项目自己的vue版本一致这样能压掉嵌套依赖里的旧版本。5.2 配置与运行时类问题现象三Element-Plus 组件能渲染但完全没有样式按钮是裸的 HTML 样子。原因分两种。一种是全量引入时漏了import element-plus/dist/index.css另一种是按需引入时ElementPlusResolver没配importStyle或者插件装了但vite.config.ts里没生效。先检查main.ts有没有残留的全量引入再检查插件配置。如果是按需模式把Components插件的resolvers确认写上然后重启 dev server插件配置改动不重启不生效。现象四mock 接口一直 404或者请求跑到了真后端。原因基本是路径不匹配。前端baseURL是/api请求路径是/user/list拼出来/api/user/listmock 文件里必须写全这个路径。另一个原因是server.proxy也配了/api的代理Vite 的中间件顺序里 proxy 可能先于 mock 处理请求被转发走了。排查时打开viteMockServe的logger: true请求命中 mock 会在终端打日志没日志就说明没命中问题在路径或中间件顺序。开发期用 mock 就把 proxy 里对应前缀注释掉。现象五本地一切正常npm run build之后部署线上接口返回假数据。原因是 mock 开关写死成enable: true或者判断条件没考虑mode。构建时mode是production只要开关跟着mode和VITE_USE_MOCK走就不会出这个问题。已经上线的项目去dist/assets里搜mockjs特征字符串能搜到就说明打进去了回头改配置重新构建。这类问题属于上线前必查项别等用户反馈。6. 装完怎么验证三条链路跑通才算数npm run dev起来、页面能看见只能说明服务启动了不代表这套环境配好了。我验证这套 Vue3 Element-Plus mockjs 骨架固定跑三条链路任何一条不通都算没装完。第一条是组件链路。打开页面找一个用了 Element-Plus 组件的路由确认三件事组件渲染正常、样式生效、图标能显示。样式最容易骗人按钮有边框不代表样式全加载了重点看表格、弹窗、下拉这类结构复杂的组件它们对 CSS 依赖更重。图标用的是element-plus/icons-vue按需模式下图标组件不会自动注册需要手动全局注册或者在页面里单独引// main.ts图标全局注册按需模式下必须手动做 import * as ElementPlusIconsVue from element-plus/icons-vue for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) }第二条是 mock 链路。打开浏览器开发者工具的网络面板触发一次列表请求看响应体里是不是code: 200加一串随机数据。这一步的关键是看请求有没有真的发出去如果网络面板里根本没有这条请求说明被 mock 中间件提前拦了属于正常如果发出去且返回 404说明 mock 没命中回上一章查路径。再确认分页参数能传进去response函数里拿到的query.page有值说明参数透传没问题。第三条是环境切换链路也是最容易被跳过的一条。执行一次生产构建# 生产构建构建产物里不应包含 mock 数据 npm run build # 本地预览构建产物模拟线上环境 npm run preview然后在dist目录里搜一下mockjs、cname这类特征串搜不到才算干净。再打开预览页面发一次请求这时候应该打到真实后端或者报跨域而不是返回假数据。三条链路对应的检查点我整理成表链路检查点通过标准组件表格、弹窗、图标渲染正常且样式完整mock网络面板响应体返回模板数据分页参数生效环境切换构建产物与预览请求产物无 mock 特征请求不走拦截这套验证流程我从一次线上事故之后固定下来的。那次是 mock 开关写死本地测得好好的构建上线后用户看到的全是假数据排查了两个小时才发现问题出在一个布尔值上。从那以后我每次装完这套骨架不管多急npm run build加一次产物搜索都强制走一遍五分钟的事比上线后回滚便宜太多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?