当前位置: 首页 > news >正文

Vite多入口配置实战:Vue3项目架构与路由管理指南

1. 项目概述:为什么我们需要多入口配置?

如果你是从 Vue CLI 或者 Webpack 时代过来的前端开发者,第一次接触 Vite 时,可能会被它简洁的vite.config.js搞得有点懵。特别是当你接到一个需求,不是做一个单页应用(SPA),而是要做一个包含多个独立页面的网站,比如一个公司官网,有首页、关于我们、产品介绍、联系我们等多个独立的 HTML 页面。在 Webpack 里,我们可能会用html-webpack-plugin配多个实例,或者用MPA的配置思路。但在 Vite 的世界里,这个配置逻辑变得更直观,却也因为文档的分散和默认的单入口设定,让不少新手感到困惑。

这个项目要解决的,就是如何在 Vue3 + Vite 的项目中,优雅地配置多个 HTML 入口文件,并且为每个独立的页面(尤其是那些不需要复杂前端路由的页面)配置好 Vue 路由。听起来好像是把简单问题复杂化?其实不然。想象一下,你有一个后台管理系统(主应用,SPA)和一个对外展示的落地页(独立页面),你肯定不希望为了改个落地页的标题就去动主应用的index.html,更不希望落地页的打包产物混在主应用的dist文件夹里难以管理。多入口配置就是将它们物理隔离、独立开发、独立构建的最佳实践。

我自己在从零搭建一个中台项目时就遇到了这个需求:主应用是一个复杂的 SPA,同时需要几个独立的、轻量级的活动页面。如果全塞进一个 SPA 里,路由和状态管理都会变得臃肿,而且活动页面的频繁迭代会影响到主应用的发布流程。多入口配置完美地解决了这个问题,让不同功能模块的开发和部署可以解耦。接下来,我会手把手带你从零配置,确保你看完就能在自己的项目里用起来。

2. 核心思路与项目结构设计

在动手写配置之前,我们先要把思路理清楚。Vite 的多入口配置,核心是理解“入口”的定义。在 Vite 中,一个入口通常对应一个 HTML 文件。Vite 的开发服务器和构建过程都会根据这些入口来工作。

2.1 多入口配置的核心逻辑

Vite 的构建配置项build.rollupOptions.input是控制多入口的关键。这个配置直接传递给底层的 Rollup 打包器。默认情况下,它的值是当前目录下的index.html。当我们需要多个入口时,就需要把它改成一个对象,对象的键(key)是入口的名称,值(value)是该入口对应的 HTML 文件的路径。

这个“名称”非常重要,它会直接影响打包后产物的目录结构。例如,如果你设置input: { main: 'src/main.html', about: 'src/about.html' },那么构建后,dist目录下就会生成main.htmlabout.html,而它们对应的 JS、CSS 资源可能会被放在以入口名命名的子目录下(取决于其他配置),从而实现资源的隔离。

2.2 项目结构规划

一个清晰的项目结构是成功的一半。我推荐下面这种结构,它兼顾了清晰度和灵活性:

your-vite-project/ ├── public/ # 静态资源(不经过Vite处理) ├── src/ │ ├── entries/ # 存放所有入口文件 │ │ ├── main/ # 主应用入口 │ │ │ ├── index.html │ │ │ ├── main.js # 主应用入口JS │ │ │ └── App.vue # 主应用根组件 │ │ └── about/ # “关于我们”页面入口 │ │ ├── index.html │ │ ├── about.js # 关于页面入口JS │ │ └── About.vue # 关于页面组件 │ ├── components/ # 公共组件 │ ├── router/ # 路由配置(主应用使用) │ │ └── index.js │ ├── views/ # 主应用的页面组件 │ └── assets/ # 模块化资源(图片、样式等) ├── vite.config.js # Vite 配置文件 ├── package.json └── index.html # (可选)默认入口,可删除或指向主入口)

为什么要把入口文件放在src/entries下,而不是项目根目录?主要有两个原因:一是为了项目结构更干净,根目录只留配置文件;二是方便统一管理,所有需要被 Vite 处理的入口都聚集在一起,逻辑清晰。每个入口目录(如main,about)都自成一体,包含自己的 HTML、JS 入口和根组件,独立性非常强。

注意:很多教程会把 HTML 放在项目根目录,这在入口不多时没问题。但一旦入口多起来,根目录会变得非常混乱。将入口归集到src下是更工程化的做法,也符合 Vite 推荐将源码放在src目录的惯例。

2.3 单页面路由配置的定位

这里的“单页面路由配置”需要特别理解。它并不是指整个项目是一个 SPA(虽然主应用可能是),而是指每个独立的入口 HTML 页面内部,可以拥有自己的 Vue Router 实例和路由配置。例如,你的main入口是一个复杂的后台管理系统,它内部需要 Vue Router 来实现页面切换。而about入口就是一个简单的静态展示页,它可能根本不需要路由,或者只需要一个最简单的、只有一个路由的路由器。

因此,我们的配置需要支持两种模式:

  1. 多页面应用(MPA)模式:项目由多个独立的 HTML 文件构成,它们之间通过<a>标签跳转,每次跳转都是完整的页面重载。
  2. 混合模式:项目整体是 MPA,但其中的某个或某几个入口内部是 SPA,拥有自己的前端路由。

我们的配置方案将同时覆盖这两种场景。

3. 从零开始:基础配置与多入口实现

现在,我们开始动手。首先确保你有一个基于 Vue3 和 Vite 的项目。如果还没有,可以使用官方命令快速创建一个:npm create vite@latest my-project -- --template vue。创建好后,我们按照前面规划的结构来改造它。

3.1 调整项目结构

  1. src目录下创建entries文件夹。
  2. 将项目根目录的index.html移动到src/entries/main/目录下。同时,将src/main.jssrc/App.vue也移动到这个目录,并分别改名为main.jsApp.vue(原名也可以,这里为了清晰)。
  3. 修改src/entries/main/index.html中的脚本引用路径。原来可能是<script type="module" src="/src/main.js"></script>,现在需要根据新的位置调整。因为 HTML 文件在src/entries/main/下,而入口 JS 在同一个目录,所以可以改为相对路径<script type="module" src="./main.js"></script>,或者使用绝对路径/src/entries/main/main.js(Vite 能正确解析)。
  4. 创建第二个入口。在src/entries/about/目录下创建index.htmlabout.jsAbout.vue

src/entries/about/index.html内容示例:

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>关于我们 - 我的网站</title> </head> <body> <div id="app"></div> <script type="module" src="./about.js"></script> </body> </html>

src/entries/about/about.js内容示例:

import { createApp } from 'vue' import About from './About.vue' createApp(About).mount('#app')

src/entries/about/About.vue内容就是一个简单的 Vue 组件。

3.2 配置 vite.config.js

这是最关键的一步。打开vite.config.js,我们需要配置build.rollupOptions.input

import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' // 引入 path 模块用于解析路径 // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], build: { rollupOptions: { // 多入口配置 input: { main: resolve(__dirname, 'src/entries/main/index.html'), about: resolve(__dirname, 'src/entries/about/index.html'), // 可以继续添加更多入口... } } } })

这里使用了 Node.js 的path.resolve方法来获取 HTML 文件的绝对路径,这是最可靠的方式。__dirname代表当前配置文件所在的目录。

3.3 开发服务器与路径别名

配置好后,运行npm run dev,你会发现 Vite 默认可能还是打开根目录的index.html(如果还存在的话)。我们需要告诉 Vite 开发服务器,我们的入口已经变了。

一种方法是直接访问http://localhost:5173/src/entries/main/index.html,但这很不优雅。更好的方式是在vite.config.js中配置root选项,并设置一个路径别名,让开发体验更顺畅。

import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ // 设置项目根目录为 src,这样默认索引文件就在 src 下找 // root: resolve(__dirname, 'src'), // 可选,根据习惯调整 plugins: [vue()], resolve: { alias: { // 设置 '@' 指向 src 目录,方便在组件中引用 '@': resolve(__dirname, 'src'), }, }, build: { rollupOptions: { input: { main: resolve(__dirname, 'src/entries/main/index.html'), about: resolve(__dirname, 'src/entries/about/index.html'), }, // 输出配置:让打包后的资源结构更清晰 output: { // 入口块的命名格式,[name] 会被替换为 input 对象的 key(如 main, about) entryFileNames: 'assets/js/[name]-[hash].js', // 块(非入口,如动态导入的组件)的命名格式 chunkFileNames: 'assets/js/[name]-[hash].js', // 资源文件(如图片、字体)的命名格式 assetFileNames: 'assets/[ext]/[name]-[hash].[ext]' } } } })

现在,你可以删除项目根目录的index.html了。启动开发服务器后,直接访问http://localhost:5173可能会报错,因为 Vite 找不到默认的index.html。你需要通过http://localhost:5173/src/entries/main/index.html来访问主应用。为了更方便,可以在package.jsonscripts里添加一个自定义命令,或者使用 Vite 的server.open配置来自动打开指定页面。

一个更实用的技巧是,保持根目录有一个最简单的index.html作为导航页,里面列出所有入口的链接,这在开发多入口项目时非常方便。

4. 为特定入口配置 Vue Router

现在我们已经有了两个独立的入口。假设我们的main入口是一个后台管理系统,需要复杂的前端路由。而about入口是静态页,不需要路由。我们来为main入口配置 Vue Router。

4.1 安装与创建路由文件

首先,在主入口目录下安装 Vue Router:npm install vue-router@4

src/entries/main/目录下(或者按照习惯放在src/router/下),创建路由配置文件。这里我们放在入口目录下以保持其独立性,命名为router.js

// src/entries/main/router.js import { createRouter, createWebHistory } from 'vue-router' // 假设你的页面组件放在 src/views/ 或 src/entries/main/views/ 下 import Dashboard from '@/views/Dashboard.vue' // 使用了路径别名 @ import UserList from '@/views/UserList.vue' const routes = [ { path: '/', name: 'Dashboard', component: Dashboard }, { path: '/users', name: 'UserList', component: UserList }, // ... 其他路由 ] const router = createRouter({ // 使用 history 模式。注意:对于多入口项目,每个入口的 base URL 可能需要特别处理。 // 这里我们假设主应用部署在网站的根路径,所以用 `/`。 // 如果你的主应用部署在 `/admin` 子路径下,则需要设置 history: createWebHistory('/admin') history: createWebHistory(), routes }) export default router

4.2 在主入口中集成路由

接下来,修改src/entries/main/main.js文件,将路由实例挂载到 Vue 应用上。

// src/entries/main/main.js import { createApp } from 'vue' import App from './App.vue' import router from './router' // 引入路由配置 const app = createApp(App) app.use(router) // 使用路由插件 app.mount('#app')

同时,需要修改src/entries/main/App.vue,加入<router-view>来显示路由对应的组件。

<!-- src/entries/main/App.vue --> <template> <div id="app"> <!-- 这里可以放导航栏等公共布局 --> <nav> <router-link to="/">首页</router-link> | <router-link to="/users">用户管理</router-link> </nav> <!-- 路由出口,匹配的组件将渲染在这里 --> <router-view /> </div> </template> <script setup> // 使用 Composition API </script>

4.3 关于路由 History 模式的注意事项

在单入口 SPA 中,我们常使用createWebHistory()来获得干净的 URL。但在多入口项目中,特别是当你的不同入口可能部署在同一域名的不同路径下时,需要格外小心。

  • 场景一:所有入口部署在根目录。就像我们上面配置的,每个入口都是一个独立的 HTML 文件,如main.htmlabout.html。此时,主应用(main入口)内部的路由使用createWebHistory()是没问题的。用户访问http://your-site.com/main.html进入应用,然后在前端路由间切换(如/users)。但是,如果你直接刷新http://your-site.com/users这个页面,服务器会返回 404,因为服务器上不存在/users这个文件或路由。这就需要服务器配置(如 Nginx 的try_files)将所有前端路由请求都回退到main.html
  • 场景二:入口部署在子路径。例如,主管理后台部署在/admin路径下。那么,你的main入口最终访问地址可能是http://your-site.com/admin/main.html。此时,Vue Router 的 base 需要与之匹配:createWebHistory('/admin')。同时,Vite 的base配置项(在vite.config.js中)也应该设置为'/admin/',以确保资源路径正确。

实操心得:对于多入口项目,我个人更倾向于在每个入口内部使用Hash 模式createWebHashHistory()),尤其是在开发环境或对 SEO 要求不高的后台系统。因为 Hash 模式(URL 带#)完全由前端控制,不会和服务器路径产生任何冲突,部署起来最简单,无需额外的服务器配置。你可以根据项目实际部署环境灵活选择。

5. 进阶优化:自动化生成入口与公共代码抽离

当入口页面越来越多,手动在vite.config.js里添加每一个input项会变得非常繁琐。我们可以利用 Node.js 脚本自动扫描src/entries目录来动态生成配置。

5.1 动态生成多入口配置

修改vite.config.js

import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' import fs from 'fs' import path from 'path' // 自动扫描 entries 目录下的所有 index.html 作为入口 function getEntryPoints() { const entriesDir = resolve(__dirname, 'src/entries') const entryPoints = {} // 递归或非递归读取目录,这里用非递归示例 const entryFolders = fs.readdirSync(entriesDir, { withFileTypes: true }) .filter(dirent => dirent.isDirectory()) .map(dirent => dirent.name) for (const folder of entryFolders) { const indexPath = path.join(entriesDir, folder, 'index.html') if (fs.existsSync(indexPath)) { // 使用文件夹名作为入口名 entryPoints[folder] = resolve(__dirname, indexPath) } } return entryPoints } export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src'), }, }, build: { rollupOptions: { input: getEntryPoints(), // 使用函数返回值 output: { entryFileNames: 'assets/js/[name]-[hash].js', chunkFileNames: 'assets/js/[name]-[hash].js', assetFileNames: 'assets/[ext]/[name]-[hash].[ext]' } } } })

这样,以后你只需要在src/entries下新建一个文件夹(如contact/),并放入index.html和对应的 JS 文件,它就会自动被纳入构建,无需修改 Vite 配置。

5.2 公共依赖抽离

在多入口项目中,不同的页面可能会用到相同的第三方库(如 Vue、Lodash、Axios)。如果不做处理,每个入口打包出来的 JS 都会包含这些库的代码,导致总体积变大。我们可以利用 Rollup 的manualChunks功能来手动分割这些公共模块。

修改vite.config.js中的build.rollupOptions.output

export default defineConfig({ // ... 其他配置 build: { rollupOptions: { input: getEntryPoints(), output: { entryFileNames: 'assets/js/[name]-[hash].js', chunkFileNames: 'assets/js/[name]-[hash].js', assetFileNames: 'assets/[ext]/[name]-[hash].[ext]', // 手动分包策略 manualChunks(id) { // 将 node_modules 中的依赖包单独打包 if (id.includes('node_modules')) { // 可以进一步细化,将特定的、较大的库单独打包 if (id.includes('vue')) { return 'vendor-vue' } if (id.includes('lodash')) { return 'vendor-lodash' } // 其他依赖打包到一个通用的 vendor 块中 return 'vendor' } // 如果你的项目有大量的公共工具函数或组件,也可以在这里进行抽离 // if (id.includes('src/utils') || id.includes('src/components')) { // return 'common' // } } } } } })

这样配置后,打包会生成vendor-vue.jsvendor-lodash.jsvendor.js等文件。浏览器在加载不同页面时,如果这些公共 chunk 已经缓存过,就无需重复下载,显著提升加载速度。

6. 开发、构建与部署实战

6.1 开发环境运行

配置完成后,运行npm run dev。Vite 会启动开发服务器。由于我们移除了根目录的index.html,直接访问localhost:5173会列出项目目录。你有几种选择:

  1. 访问具体的入口文件,如http://localhost:5173/src/entries/main/index.html
  2. 在根目录保留一个简单的index.html作为导航页,里面用链接指向各个入口。
  3. 配置 Vite 的server.openserver.proxy(如果需要)来提升开发体验。例如,可以在vite.config.js中添加:
    export default defineConfig({ // ... 其他配置 server: { open: '/src/entries/main/index.html', // 启动后自动打开主入口 // proxy: { ... } // 配置 API 代理 } })

6.2 生产环境构建

运行npm run build。Vite 会根据配置,为每个入口单独打包。构建产物默认输出到dist目录,结构大致如下:

dist/ ├── assets/ │ ├── js/ │ │ ├── main-xxx.js # 主入口代码 │ │ ├── about-xxx.js # about入口代码 │ │ ├── vendor-vue-xxx.js # 抽离的 Vue 库 │ │ └── vendor-xxx.js # 其他公共依赖 │ └── css/ ... # 样式文件 ├── main.html # 主入口 HTML └── about.html # about 入口 HTML

你可以清晰地看到,每个入口都有自己独立的 HTML 和对应的 JS 资源,公共库也被抽离出来。

6.3 部署注意事项

部署时,你需要将整个dist目录上传到你的 Web 服务器(如 Nginx、Apache)。

  • 对于纯静态页面(如about.html:直接访问对应 URL 即可,例如https://your-domain.com/about.html

  • 对于带有前端路由的 SPA 入口(如main.html

    • 如果使用Hash 模式,部署最简单,无需任何服务器配置。
    • 如果使用History 模式必须配置服务器,将所有非静态资源文件的请求重定向到该入口的 HTML 文件。以 Nginx 为例,针对main.html入口的配置可能如下:
      location / { # 首先尝试作为文件或目录访问,如果找不到,则重写到 main.html try_files $uri $uri/ /main.html; }
      这意味着,当用户访问https://your-domain.com/users时,Nginx 会先查找dist/users文件或目录,找不到则返回dist/main.html,然后由前端路由接管。

    如果你的多个 SPA 入口部署在同一域名下,服务器配置会复杂一些,可能需要根据路径前缀(如/admin/,/app/)进行不同的重写规则配置。

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

在实际操作中,你肯定会遇到一些坑。这里我总结几个最常见的问题和解决方法。

7.1 开发服务器热更新(HMR)失效

问题描述:修改了某个入口的 Vue 组件,浏览器没有自动刷新。排查思路

  1. 检查文件路径:确保你的组件文件在正确的目录下,并且被入口 JS 正确导入。Vite 的 HMR 基于模块依赖图,如果文件没有被任何活动入口引用,HMR 不会触发。
  2. 检查 Vite 插件:确保@vitejs/plugin-vue已正确安装和配置。这个插件负责处理.vue文件的 HMR。
  3. 检查 HTML 文件:确认 HTML 文件中的<script>标签src属性指向了正确的入口 JS 文件,并且使用的是相对路径或能被 Vite 正确解析的路径。路径错误会导致整个入口模块不被 Vite 正确追踪。

7.2 构建后资源路径 404

问题描述:本地开发正常,但构建后上传到服务器,页面可以打开,但图片、字体等资源加载失败(404)。排查思路

  1. 检查public目录:放在public目录下的静态资源,在代码中应该使用绝对路径引用(如/img/logo.png)。构建时,public下的文件会被原封不动地复制到dist根目录。如果你的项目部署在子路径(如/my-app/),则需要使用base公共路径,或者将资源放在assets目录下通过模块化引入。
  2. 检查assets目录引用:在 Vue 组件或 JS 中通过模块化导入的assets资源,Vite 会处理并生成带哈希的文件名。确保你在模板或样式中引用的是导入后的变量,而不是硬编码的字符串路径。
    • 正确示例(Vue SFC):
      <template> <img :src="logoUrl" alt="logo"> </template> <script setup> import logoUrl from '@/assets/logo.png' // 正确:模块化导入 </script>
    • 错误示例:
      <template> <img src="@/assets/logo.png" alt="logo"> <!-- 错误:模板中的 @ 别名在构建后可能无法解析 --> </template>
  3. 检查vite.config.js中的base配置:如果你的项目部署在非根路径(如https://example.com/my-project/),必须在vite.config.js中设置base: '/my-project/'。这个值会被 Vite 用于所有资源 URL 和打包产物的路径前缀。

7.3 路由跳转或页面刷新报错 404(History 模式)

问题描述:在使用了createWebHistory()的 SPA 入口内,点击页面内链接跳转正常,但手动刷新浏览器或直接输入 URL 访问某个子路由(如/users)时,服务器返回 404。根本原因:这个路径/users在你的服务器上并不存在对应的物理文件。服务器在收到这个请求时,试图去寻找dist/users文件或目录,当然找不到。解决方案:如第 6.3 节所述,必须在 Web 服务器(Nginx、Apache、Express 等)上配置“回退路由”,将所有非静态文件请求都指向该 SPA 入口的 HTML 文件。这是使用 History 模式必须做的服务器端配置。

7.4 多个入口间如何共享状态或组件?

问题描述main入口和about入口是完全独立的 Vue 应用,它们无法直接共享 Vuex/Pinia 状态或通过事件总线通信。解决方案

  1. 共享逻辑,而非状态:将可复用的工具函数、自定义 Hook、业务逻辑封装成独立的 ES 模块,放在src/utilssrc/composables目录下,供各个入口的 JS 文件导入使用。
  2. 共享 UI 组件:将通用的 Vue 组件放在src/components/common目录下,各个入口按需导入。
  3. 状态共享需求:如果两个独立页面间真的有强烈的状态同步需求(这种情况较少),可能需要重新评估架构。或许它们本应属于同一个 SPA 入口下的不同路由。如果必须独立,可以考虑使用浏览器本地存储(LocalStorage/SessionStorage)URL 查询参数进行简单的数据传递,或者使用window.postMessage进行跨页面通信(前提是页面间有明确的打开关系)。

7.5 打包后入口 HTML 文件中的资源引用路径不对

问题描述:构建后的dist/main.html中,<script><link>标签的src/href路径不正确,缺少assets目录或哈希值。排查思路

  1. 这通常由vite.config.jsbuild.rollupOptions.output的配置与 Vite 的base配置不匹配导致。
  2. 确保你的output.entryFileNames等路径配置与最终访问的 URL 结构一致。Vite 会自动根据这些配置和base设置,在 HTML 中注入正确的资源路径。
  3. 一个常见的错误是,在配置了base: '/sub-path/'后,output配置却写成了entryFileNames: 'js/[name].js',这可能导致构建时代码生成在dist/js/,但 HTML 引用的是/sub-path/assets/js/...,路径对不上。检查构建日志和最终的dist/index.html文件内容是最直接的调试方法。

配置多入口的过程就像搭积木,一开始可能会觉得步骤繁多,但一旦理解了每个配置项的作用和它们之间的关联,就会变得非常清晰。这种架构为项目提供了极大的灵活性,特别适合那些由多个相对独立功能模块组成的中大型项目。从简单的活动页面到复杂的后台系统,都可以被很好地组织在一起,又能保持开发和部署的独立性。

http://www.jsqmd.com/news/1379587/

相关文章:

  • Python实现LSM模型:可转债定价与套利策略的工程化实践
  • XSS靶场实战:从原理到绕过技巧的深度解析
  • HEX与RGB颜色编码实战:从单片机调光到Python图像处理
  • G-Helper风扇控制深度解析:华硕笔记本散热优化实战方案
  • 手持 vs 便携 vs 台式:三类拉曼光谱仪的品牌格局与选型指南 - 品牌推荐大师1
  • FIFA 23实时编辑器深度指南:5大进阶技巧打造完美足球世界
  • 106、YOLOv12核心架构深度解剖:NMS后处理与WBF融合策略在v12中的适配——从源码到实验对比的完整教程
  • 电车露营来袭,酒店要被新能源车打败了?
  • GPT-5.6编程能力深度解析:从代码生成到系统设计的AI开发革命
  • 极空间NAS部署本地大模型:基于Docker与Qwen2.5的Kimi平替方案
  • Vue项目axios二次封装实战:从基础拦截器到高级特性
  • 终极Minemap地图查看器教程:无需安装游戏,3分钟解锁Minecraft完整世界地图
  • 异构计算编程模型与性能优化实战指南
  • K8s Pod控制器(第三章)完整详细总结
  • 如何轻松解密音乐文件:Unlock-Music开源工具完整使用指南
  • 从零构建亚马逊动态关键词库:Python+Scrapy实战与SSS级机会词挖掘
  • 基于Vue 3构建JSON可视化编辑器:从原理到实战
  • C++俄罗斯方块项目实战:从面向对象设计到游戏循环实现
  • 2026年8月上海报废电池包回收:这5种途径靠谱,别再乱丢浪费钱了!
  • Visual Studio 2022安装配置全攻略:C语言新手一站式开发环境搭建
  • docker安装jenkins, pipeline再调用宿主机的docker, 实现远程主机部署网站,以下以 springboot 为例
  • 小白程序员必看:收藏这份AI Agent(智能体)入门指南,轻松入门大模型时代!
  • 从零开始构建SDK:核心设计、架构实现与工程实践全指南
  • 国企工程项目管理数字化趋势:2026年选型评估框架
  • C Primer Plus——第三章 数据和C
  • 前端静态资源优化全方案与性能提升实践
  • 从工程视角拆解 AI 销售陪练:角色扮演架构、RAG 与评分引擎的落地踩坑
  • Windows渗透测试载荷加载技术:进程注入与反射式DLL绕过防御
  • 为什么架构设计提倡无状态化
  • Git安装全攻略:从核心概念到实战配置,新手避坑指南