news 2026/8/13 5:02:56

Node.js+Vue项目搭建全流程:从环境配置到工程化实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Node.js+Vue项目搭建全流程:从环境配置到工程化实践

1. 项目概述:为什么选择Node.js+Vue这个组合?

如果你刚从前端入门,或者是从其他技术栈(比如纯jQuery时代或者React)转过来,第一次看到“使用Node.js+Vue搭建项目”这个标题,可能会有点懵:Node.js不是后端吗?Vue不是前端框架吗?它俩怎么搅和到一块儿去了?这恰恰是现在前端工程化的核心所在。简单来说,Node.js在这里扮演的不是服务器角色,而是一个强大的“构建工具链运行环境”和“包管理器平台”。

五年前,我们可能还在手动引入一个vue.js的CDN链接,然后在HTML里写new Vue({...})。但现在,一个现代化的Vue项目远不止于此。它需要处理模块化、组件化、预处理器(Sass/Less)、代码压缩、热更新(HMR)等一系列复杂任务。这些任务靠浏览器自己干不了,需要一个在开发阶段能跑在我们本地机器上的“引擎”,这个引擎就是Node.js。通过它,我们可以运行Vue官方提供的脚手架工具Vue CLI,或者更现代的Vite,来一键生成一个配置好了Webpack或Vite、Babel、ESLint等工具的项目骨架。所以,“从零搭建”并不是真的从空白文件开始手写所有配置(那会是一场噩梦),而是指从一个干净的起点,通过命令行工具,快速初始化一个具备完善工程化能力的Vue项目原型。

我选择这个组合来分享,是因为它覆盖了从新手到进阶工程师的必经之路。理解了这套流程,你不仅知道怎么创建一个项目,更能明白背后每个环节的意义,未来无论是优化构建速度,还是整合其他工具(如状态管理Vuex/Pinia、路由Vue Router),都能心中有数。下面,我就带你走一遍这个流程,并拆解其中每一个关键步骤和可能遇到的“坑”。

2. 环境准备:安装与验证Node.js和npm/yarn

万事开头难,而搭建环境往往是第一个难关。很多新手卡在这里,不是因为步骤复杂,而是因为一些细节没注意到。

2.1 Node.js的安装与版本选择

首先,你需要安装Node.js。访问其 官方网站 下载安装包。这里你会面临第一个选择:LTS版本还是Current版本?

  • LTS(长期支持版):这是绝大多数生产环境和稳定开发的选择。它经过了更长时间的测试,拥有长期的安全和维护更新,兼容性最好。对于学习和企业级项目,无脑选LTS。
  • Current(当前最新版):包含了最新的特性和性能改进,但可能不够稳定,一些第三方库可能还没来得及适配。适合喜欢尝鲜的开发者。

注意:我强烈建议初学者选择LTS版本。网络上很多教程、开源库都是基于某个LTS版本编写的,用最新版可能会遇到一些意想不到的兼容性问题。例如,热词里提到的error installing 24.19.0: node.js v24.19.0 is not yet released,这就是在尝试安装一个尚未发布或不可用的版本时可能出现的错误,从侧面说明了遵循稳定版本的重要性。

安装过程很简单,一路“下一步”即可。安装完成后,你需要验证是否成功。

2.2 验证安装与理解npm

打开你的终端(Windows用CMD或PowerShell,Mac用Terminal),输入以下命令:

node -v npm -v

如果分别输出了Node.js和npm的版本号(比如v18.20.010.7.0),恭喜你,安装成功。

这里要理解一个关键点:npm(Node Package Manager)是随Node.js一同安装的包管理工具。我们后面安装Vue脚手架、项目依赖库,全部都要通过npm(或者它的替代品yarn/pnpm)来完成。你可以把它想象成前端的“应用商店”。

2.3 配置npm镜像源(加速下载)

由于npm默认的仓库服务器在国外,直接下载包速度可能会很慢,甚至失败。因此,配置国内的镜像源是必不可少的一步。淘宝提供了稳定的npm镜像。

设置全局镜像源(推荐):

npm config set registry https://registry.npmmirror.com/

验证是否设置成功:

npm config get registry

如果返回https://registry.npmmirror.com/,说明配置正确。

实操心得:除了npm config set,还有一种更灵活的工具叫nrm(npm registry manager),可以快速切换不同的镜像源。但对于新手,直接设置全局镜像最简单有效。另外,有些公司内部有私有仓库,那时就需要配置特定的registry。

3. 项目创建:使用Vue CLI脚手架生成项目骨架

环境准备好了,现在可以创建我们的Vue项目了。虽然现在Vite风头正劲,但Vue CLI依然是经典、稳定且功能全面的选择,特别适合初学者理解整个项目结构。

3.1 安装Vue CLI

Vue CLI是一个全局安装的命令行工具。在终端中运行:

npm install -g @vue/cli # 或者使用yarn # yarn global add @vue/cli

-g参数代表全局安装,这样你才能在任意目录下使用vue这个命令。

安装完成后,验证:

vue --version

3.2 创建新项目

找一个你喜欢的目录,在终端中执行创建命令:

vue create my-vue-project

这里的my-vue-project是你的项目名称,可以自定义。执行后,你会进入一个交互式的配置界面。

3.3 详解预设(Preset)选择

这是第一个关键决策点。CLI会问你:

? Please pick a preset: Default ([Vue 3] babel, eslint) Default ([Vue 2] babel, eslint) Manually select features
  • Default (Vue 3): 选择这个,CLI会快速为你创建一个基于Vue 3的默认项目,包含Babel和ESLint。这是最快捷的方式。
  • Manually select features我强烈推荐新手也尝试一下这个选项。虽然多花几分钟,但你能清楚地看到现代前端项目包含了哪些“零件”。

选择手动模式后,你会看到一系列可选项,用空格键选中或取消:

? Check the features needed for your project: (*) Babel // 将ES6+代码转译为旧版本浏览器兼容的JS (*) TypeScript // 选择是否使用TS,初期可不选 (*) Progressive Web App (PWA) Support // 渐进式Web应用支持 (*) Router // Vue Router(官方路由库),**建议勾选** (*) Vuex // 状态管理库,对于简单项目可先不选 (*) CSS Pre-processors // CSS预处理器(Sass/Less),**建议勾选** (*) Linter / Formatter // 代码检查与格式化工具(如ESLint),**建议勾选** (*) Unit Testing // 单元测试 (*) E2E Testing // 端到端测试

我的建议配置(针对初学者项目)

  1. Babel: 必选,处理兼容性。
  2. Router: 必选。即使是单页面,路由也是组织页面结构的核心,早点接触有好处。
  3. CSS Pre-processors: 建议选。之后会让你选择Sass/SCSS、Less等。我推荐Sass/SCSS,生态更成熟。这能让你写样式更高效。
  4. Linter / Formatter: 建议选。它会帮你强制养成好的代码风格,并在早期发现潜在错误。选择ESLint + Prettier的组合,并选择Lint on save(保存时检查)。
  5. 其他如Vuex、Testing,可以在项目需要时再手动添加,保持初始项目的简洁。

后续还会询问一些细节,比如:

  • 选择Vue 3还是Vue 2?-> 无特殊要求,选Vue 3
  • 是否使用history模式的路由?-> 输入Y。这是更友好的URL模式(去掉URL中的#号),虽然部署时需要服务器额外配置,但开发阶段没问题。
  • 选择Sass/SCSS的编译器?-> 选择dart-sass(官方首选,纯JS实现,兼容性好)。
  • ESLint配置放在哪里?->In dedicated config files(独立的配置文件),更清晰。
  • 是否保存本次配置为预设?-> 输入N(暂时不用)。

然后,CLI就会开始自动创建项目,并安装所有依赖包。这个过程取决于你的网速。

4. 项目结构与核心文件解析

创建完成后,进入项目目录并看看生成了什么:

cd my-vue-project

用代码编辑器(如VSCode)打开这个文件夹。你会看到一个标准的Vue CLI项目结构:

my-vue-project/ ├── node_modules/ # 所有依赖库,巨大,不用提交到git ├── public/ # 静态资源目录,该目录下的文件会被直接复制,不经过webpack处理 │ ├── index.html # 项目主HTML模板 │ └── favicon.ico ├── src/ # 源代码目录,我们的工作核心区 │ ├── assets/ # 静态资源(图片、字体等),会被webpack处理 │ ├── components/ # Vue组件目录 │ ├── router/ # Vue Router路由配置(如果创建时选了) │ ├── views/ # 页面级组件(通常与路由对应) │ ├── App.vue # 根组件 │ ├── main.js # 应用入口文件 │ └── ... ├── .gitignore # Git忽略文件配置 ├── babel.config.js # Babel配置 ├── package.json # **项目核心配置文件** ├── README.md └── vue.config.js # Vue CLI项目配置(可在此覆盖默认webpack配置)

4.1 解剖package.json:项目的“身份证”和“菜单”

这个文件是项目的基石,必须理解其关键字段:

{ "name": "my-vue-project", "version": "0.1.0", "private": true, "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" }, "dependencies": { "core-js": "^3.8.3", "vue": "^3.2.13", "vue-router": "^4.0.3" }, "devDependencies": { "@vue/cli-plugin-babel": "~5.0.0", "@vue/cli-plugin-eslint": "~5.0.0", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-service": "~5.0.0", "@vue/eslint-config-prettier": "^6.0.0", "eslint": "^7.32.0", "eslint-plugin-vue": "^8.0.3", "prettier": "^2.4.1", "sass": "^1.32.7", "sass-loader": "^12.0.0" } }
  • scripts: 定义了你可以运行的npm脚本。这是你与项目交互的主要方式。
    • npm run serve: 启动一个开发服务器,提供热更新(HMR)。这是你编码时最常用的命令。
    • npm run build: 将源代码打包、压缩、优化,生成用于生产环境的dist文件夹。
    • npm run lint: 运行ESLint检查代码规范。
  • dependencies:生产依赖。项目运行时必须的库,如Vue、Vue Router。这些会被打包到最终的代码中。
  • devDependencies:开发依赖。仅在开发阶段需要的工具,如Babel、ESLint、Webpack插件。它们不会被打进生产包。

重要提示:永远不要手动修改node_modules里的内容。所有依赖通过npm install [package-name]来管理。安装生产依赖用npm install vuex,安装开发依赖用npm install eslint-plugin-xxx --save-dev

4.2 入口文件main.js与根组件App.vue

src/main.js:这是应用的起点,像汽车的点火开关。

import { createApp } from 'vue' import App from './App.vue' import router from './router' // 如果选了Router,这里会自动导入 createApp(App).use(router).mount('#app')

它做了三件事:1. 导入Vue的工厂函数createApp;2. 导入根组件App.vue;3. 用createApp创建应用实例,加载路由插件,最后挂载到public/index.html中id为app的DOM元素上。

src/App.vue:这是整个应用的根组件,可以理解为网站的“外壳”或“布局”。

<template> <div id="app"> <nav> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </nav> <router-view/> <!-- 这是“插座”,路由匹配的页面组件会在这里渲染 --> </div> </template>

它通常包含一些全局的导航栏、侧边栏等,并通过<router-view />这个标签来动态显示不同的页面内容。

5. 开发、构建与基础配置实战

5.1 启动开发服务器与热更新

在项目根目录下运行:

npm run serve

终端会编译项目,并启动一个本地开发服务器(通常是http://localhost:8080)。用浏览器打开这个地址,你应该能看到Vue的欢迎页面。

**热更新(HMR)**是这里的神奇体验。试着修改src/components/HelloWorld.vue文件里的任何文字,保存后,浏览器页面几乎在瞬间就更新了,无需手动刷新。这极大地提升了开发效率。

5.2 编写你的第一个组件

src/components/下新建一个文件MyFirstComponent.vue。Vue组件采用单文件组件(SFC)格式,即一个.vue文件包含三部分:

<template> <!-- 组件的HTML模板 --> <div class="my-component"> <h1>{{ title }}</h1> <button @click="handleClick">点击了 {{ count }} 次</button> <p>{{ message }}</p> </div> </template> <script> // 组件的JavaScript逻辑 export default { name: 'MyFirstComponent', data() { return { title: '我的第一个Vue组件', count: 0, message: '欢迎学习Vue!' } }, methods: { handleClick() { this.count += 1; this.message = `按钮被点击了 ${this.count} 次`; } } } </script> <style scoped> /* 组件的CSS样式,`scoped`属性使样式仅作用于本组件 */ .my-component { padding: 20px; border: 1px solid #ccc; border-radius: 8px; } button { background-color: #42b983; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; } </style>

然后在src/views/HomeView.vue(或App.vue)中导入并使用它:

<template> <div class="home"> <MyFirstComponent /> </div> </template> <script> import MyFirstComponent from '@/components/MyFirstComponent.vue' export default { name: 'HomeView', components: { MyFirstComponent } } </script>

保存后,页面就会显示你的自定义组件了。@符号是Vue CLI配置的路径别名,代表src目录,非常方便。

5.3 路由配置初探

如果创建项目时选择了Router,src/router/index.js文件已经生成。打开看看:

import { createRouter, createWebHistory } from 'vue-router' import HomeView from '../views/HomeView.vue' const routes = [ { path: '/', name: 'home', component: HomeView }, { path: '/about', name: 'about', // 路由级代码分割,生成单独的代码块(about.[hash].js) // 当访问/about路径时才会加载这个组件,优化首屏加载速度 component: () => import('../views/AboutView.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), // 使用History模式 routes }) export default router

你可以在这里添加新的路由。例如,添加一个用户页面:

{ path: '/user/:id', // 动态路由,:id是参数 name: 'user', component: () => import('../views/UserView.vue') }

然后在UserView.vue组件中,可以通过this.$route.params.id或Composition API的useRoute()来获取这个id参数。

5.4 构建生产版本

开发完成后,需要将代码部署到服务器。运行:

npm run build

这个过程会进行一系列优化:压缩JavaScript和CSS、提取公共代码、压缩图片、生成带哈希值的文件名(用于缓存策略)等。最终,在项目根目录下生成一个dist文件夹,里面就是所有静态资源。你可以将这个文件夹整个上传到任何静态文件托管服务(如Nginx、Apache、Netlify、Vercel等)。

注意事项:如果你在路由中使用了history模式(去掉了#),在直接访问非首页的URL时(如http://yourdomain.com/about),静态服务器可能会返回404。这是因为服务器没有对该路径的物理文件。解决方法是在服务器配置中,将所有非静态文件的请求重定向到index.html(即“回退”到前端路由)。这是部署时必须处理的一个经典问题。

6. 进阶配置与性能优化入门

项目跑起来只是第一步,要让其更健壮、高效,还需要一些额外配置。

6.1 使用vue.config.js进行自定义配置

Vue CLI默认的Webpack配置是隐藏的,但你可以通过在项目根目录创建vue.config.js文件来覆盖或扩展它。这是解决很多实际问题的入口。

示例1:配置开发服务器代理,解决跨域问题在前后端分离开发时,前端运行在localhost:8080,后端API在localhost:3000,直接请求会产生跨域。可以在vue.config.js中配置代理:

module.exports = { devServer: { proxy: { '/api': { // 以‘/api’开头的请求 target: 'http://localhost:3000', // 后端服务器地址 changeOrigin: true, // 改变请求头中的Origin为目标地址 pathRewrite: { '^/api': '' // 重写路径,去掉‘/api’前缀 } } } } }

这样,你在前端代码中请求/api/users,开发服务器会自动将其代理到http://localhost:3000/users

示例2:配置Webpack的externals,避免打包大型库如果你通过CDN引入了像VueElement Plus这样的库,可以告诉Webpack不要将它们打包进你的bundle,以减小体积。

module.exports = { configureWebpack: { externals: { 'vue': 'Vue', 'element-plus': 'ElementPlus' } } }

同时,记得在public/index.html中通过<script>标签引入对应的CDN链接。

6.2 性能优化方向

  1. 路由懒加载: 如上文路由配置所示,使用() => import('...')语法,可以将每个路由对应的组件打包成独立的JS文件,只有访问该路由时才加载,显著提升首屏速度。
  2. 组件懒加载: 对于非路由组件,如果体积很大且非立即需要,也可以使用异步组件。
  3. 分析打包体积: 使用npm run build -- --report命令,或安装webpack-bundle-analyzer插件,生成一个可视化的报告,查看是哪些依赖占据了主要体积,从而有针对性地优化。
  4. 图片优化: 对于小图标,使用雪碧图(Sprite)或字体图标(如Font Awesome)。对于图片,使用压缩工具(如TinyPNG)或在构建时使用image-webpack-loader进行压缩。
  5. 利用浏览器缓存: 通过给打包输出的文件添加哈希值(Vue CLI已默认开启),可以设置强缓存策略,让用户浏览器缓存静态资源,减少重复下载。

7. 常见问题与排查技巧实录

在实际操作中,你几乎一定会遇到下面这些问题。我把它们和解决方案整理出来,希望能帮你节省大量搜索时间。

7.1 安装依赖失败或速度极慢

  • 问题npm install卡住或报错。
  • 排查
    1. 检查网络连接。
    2. 确认npm镜像源已正确设置为国内源(见2.3节)。
    3. 尝试清除npm缓存:npm cache clean --force,然后重试。
    4. 如果某个特定包安装失败,可以尝试单独安装它:npm install [package-name] --verbose查看详细错误信息。
  • 替代方案:考虑使用yarnpnpm,它们在某些场景下比npm更快、更节省磁盘空间。安装yarn后,用yarn install代替npm install

7.2 项目启动报错(端口占用、依赖冲突)

  • 问题npm run serve时报错Error: listen EADDRINUSE: address already in use :::8080
  • 解决:端口8080被其他程序占用。你可以:
    1. vue.config.js中修改devServer.port配置。
    2. 直接终止占用端口的进程(需要根据系统查找进程ID并kill)。
    3. 运行npm run serve -- --port 3000指定新端口。
  • 问题:启动时报各种模块找不到的错误,例如Cannot find module 'core-js/...'
  • 解决:这通常是node_modules依赖树损坏或与lock文件不匹配。
    1. 删除node_modules文件夹和package-lock.json(或yarn.lock)。
    2. 重新运行npm install

    核心技巧:将node_modules加入.gitignore,但务必package-lock.json提交到版本库。这能确保所有团队成员安装完全一致的依赖版本,避免“在我机器上是好的”这种问题。

7.3 ESLint/Prettier报错干扰开发

  • 问题:保存文件时满屏红色波浪线,或者代码被自动格式化成奇怪的样子。
  • 理解:这是代码规范工具在起作用,是好事,但需要正确配置。
  • 解决
    1. 熟悉规则:查看项目根目录下的.eslintrc.js.prettierrc文件,了解规则配置。你可以根据团队习惯调整它们。
    2. 编辑器集成:确保你的VSCode安装了ESLintPrettier插件,并在设置中开启Format On SaveCode Actions On Save
    3. 手动修复:可以运行npm run lint -- --fix来自动修复大部分可自动修复的ESLint错误。
    4. 临时忽略:如果某行代码确实需要违反规则,可以使用注释忽略:
      // eslint-disable-next-line someLegacyCode();

7.4 生产构建后页面空白或资源加载404

  • 问题:本地npm run serve正常,但npm run build后把dist丢到服务器上,打开是空白页面,控制台报JS/CSS文件404。
  • 排查
    1. 路径问题(最常见):默认情况下,Vue CLI假设你的应用被部署在域名的根路径下(如https://www.example.com/)。如果你的应用部署在子路径下(如https://www.example.com/my-app/),你需要在vue.config.js中设置publicPath
      module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/my-app/' // 生产环境子路径 : '/' // 开发环境根路径 }
      同时,路由的createWebHistory也需要传入这个基础路径:createWebHistory(process.env.BASE_URL),Vue CLI创建的项目已经自动处理了。
    2. 服务器配置:确保服务器正确配置了MIME类型,特别是对于.js.css文件。对于History模式的路由,需要配置回退到index.html(见5.4节)。

7.5 热更新(HMR)失效

  • 问题:修改代码后,浏览器没有自动刷新,或者需要手动刷新才能看到变化。
  • 排查
    1. 检查终端是否有编译错误。HMR会在编译成功后触发。
    2. 某些复杂的配置或第三方库可能导致HMR失效。尝试在vue.config.js中显式启用:
      module.exports = { devServer: { hot: true // 默认就是true,确认一下 } }
    3. 极少数情况下,可能是编辑器或文件系统监视的问题。重启开发服务器试试。

从安装Node.js到运行起一个功能完备的Vue项目,再到理解其结构和解决常见问题,这个过程就像搭积木,每一步都建立在之前的基础上。我个人的体会是,不要惧怕命令行和配置文件,它们是你掌控项目的工具。初期多踩坑是好事,每一个解决的问题都会成为你的经验。这个基于Vue CLI搭建的项目骨架,已经为你处理了90%的工程化繁琐配置,让你可以专注于Vue语法和业务逻辑本身。当你对这个流程驾轻就熟之后,再去探索更轻快的Vite,或者尝试从零手动配置Webpack,就会更有方向感。最后一个小技巧:善用npm run serve启动后终端里给出的“App running at”和“Network”两个地址,后者是你的本地IP地址,可以用来在手机或其他同一局域网的设备上访问你的开发页面,进行真机调试,非常方便。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 4:59:37

高效获取与利用高质量网页源码:从资源定位到项目实战指南

在实际项目开发和学习过程中&#xff0c;我们经常需要寻找高质量的网页源码作为参考或基础。无论是为了学习前端技术栈、研究特定交互效果&#xff0c;还是快速搭建一个演示原型&#xff0c;一份结构清晰、功能完整的源码都能极大提升效率。然而&#xff0c;网络上源码质量参差…

作者头像 李华
网站建设 2026/8/13 4:56:36

SAP AI成本失控背后:从技术试点到规模化应用的成本陷阱与管控策略

这类新闻出来&#xff0c;很多人第一反应是“AI这么烧钱吗&#xff1f;连SAP都扛不住了&#xff1f;”。但如果你真的在企业里做过IT预算、管过项目成本&#xff0c;或者负责过SAP这类核心系统的运维&#xff0c;你就会知道&#xff0c;事情远不止“AI成本高”这么简单。这背后…

作者头像 李华
网站建设 2026/8/13 4:54:21

AURIX HSM与CycurHSM:构建符合AUTOSAR SecOC的车载通讯安全实战

1. 项目背景&#xff1a;为什么汽车通讯安全不再是“附加题”&#xff1f;最近在调试一个基于英飞凌AURIX TC3xx系列MCU的域控制器项目&#xff0c;客户在验收阶段突然提出一个要求&#xff1a;所有控制器之间的CAN FD通讯报文&#xff0c;必须实现端到端的完整性和真实性验证&…

作者头像 李华
网站建设 2026/8/13 4:54:10

地平线征程6P硬解码实战:从示例代码到多路视频流处理优化

1. 项目概述&#xff1a;解码器示例代码的实战价值 最近在折腾地平线征程6P平台上的多媒体处理&#xff0c;发现官方SDK里那个 codec decoder sample &#xff08;解码器示例&#xff09;真是个宝藏。别看它只是个示例程序&#xff0c;对于刚接触这块芯片的开发者来说&#x…

作者头像 李华
网站建设 2026/8/13 4:51:16

深入SIMD向量搜索内核:从算法原理到AVX2/NEON硬件级优化实践

1. 项目概述&#xff1a;为什么我们要深入SIMD搜索内核&#xff1f;如果你正在处理海量向量数据&#xff0c;无论是推荐系统里的用户画像匹配&#xff0c;还是AI应用中的相似图片检索&#xff0c;搜索性能的毫秒之差&#xff0c;都可能直接影响到用户体验和系统成本。传统的逐元…

作者头像 李华
网站建设 2026/8/13 4:47:45

Spring Cloud外卖系统订单状态与实时通知技术实践

1. 项目背景与核心需求在餐饮外卖系统中&#xff0c;订单状态流转的实时性和准确性直接影响用户体验和商家运营效率。传统轮询方式不仅浪费服务器资源&#xff0c;还难以保证时效性。我们基于Spring Cloud架构开发的"苍穹外卖"系统&#xff0c;需要解决以下三个核心问…

作者头像 李华