vite本地运行-启动本地服务

vite本地运行-启动本地服务

创建调试项目

我们先创建一个最简单的项目,来看看vite是如何启动本地服务的。

  1. playground下面新建个文件夹vite-test1
  2. playground/vite-test1 新建 index.html

html

体验AI代码助手

代码解读

复制代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="module" src="./main.js"></script> </body> </html>

  1. playground/vite-test1 新建 main.js

js

体验AI代码助手

代码解读

复制代码

console.log('hello world')

  1. 使用pnpm init新建package.json文件

json

体验AI代码助手

代码解读

复制代码

{ "name": "vite-test1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" }, "keywords": [], "author": "", "license": "ISC", "packageManager": "pnpm@10.8.1", "devDependencies": { "vite": "workspace:*" } }

  1. .vscode/launch.json添加调试指令

json

体验AI代码助手

代码解读

复制代码

{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Debug: pnpm run dev vite-test1", "skipFiles": ["<node_internals>/**"], "program": "${workspaceFolder}/packages/vite/bin/vite.js", "args": ["--debug"], "cwd": "${workspaceFolder}/playground/vite-test1", "console": "integratedTerminal", "outFiles": ["${workspaceFolder}/packages/vite/dist/**/*.js"], "sourceMaps": true, "resolveSourceMapLocations": [ "${workspaceFolder}/packages/vite/**", "!**/node_modules/**" ] }, ] }

在Run and Debug面板,找到指令,点击开始按钮,或者F5开始调试

源码分析

1. 执行 "dev": "vite"执行时,先找到packages/vite/src/node/cli.ts文件,执行里面的action,

删除一些干扰代码,实际上就剩三步

  1. 创建服务
  2. 监听端口
  3. 控制台打印日志

ts

体验AI代码助手

代码解读

复制代码

cli .command('[root]', 'start dev server') .action(async (root: string, options: ServerOptions & GlobalCLIOptions) => { const { createServer } = await import('./server') try { const server = await createServer({ root, base: options.base, mode: options.mode, configFile: options.config, configLoader: options.configLoader, logLevel: options.logLevel, clearScreen: options.clearScreen, server: cleanGlobalCLIOptions(options), forceOptimizeDeps: options.force, }) await server.listen() server.printUrls() } catch (e) { } })

2. createServer

ts

体验AI代码助手

代码解读

复制代码

// packages/vite/src/node/server/index.ts export function createServer( inlineConfig: InlineConfig = {}, ): Promise<ViteDevServer> { return _createServer(inlineConfig, { listen: true }) }

3. _createServer

删除一些多余的代码先, 主要看三个步骤

  1. 处理config
  2. 创建http服务
  3. 返回 server

ts

体验AI代码助手

代码解读

复制代码

export async function _createServer( inlineConfig: InlineConfig = {}, options: { listen: boolean previousEnvironments?: Record<string, DevEnvironment> }, ): Promise<ViteDevServer> { const config = await resolveConfig(inlineConfig, 'serve') const { root, server: serverConfig } = config const middlewares = connect() as Connect.Server const httpServer = await resolveHttpServer(serverConfig, middlewares, httpsOptions) let server: ViteDevServer = { httpServer, async listen(port?: number, isRestart?: boolean) { }, printUrls() { }, } return server }

4. resolveConfig

主要用来处理参数 添加默认参数、处理config,然后返回


ts

体验AI代码助手

代码解读

复制代码

// packages/vite/src/node/config.ts export async function resolveConfig( ): Promise<ResolvedConfig> { let resolved: ResolvedConfig resolved = { } resolved = { ...config, ...resolved, } return resolved }

5. resolveHttpServer

ts

体验AI代码助手

代码解读

复制代码

// packages/vite/src/node/http.ts export async function resolveHttpServer( { proxy }: CommonServerOptions, app: Connect.Server, httpsOptions?: HttpsServerOptions, ): Promise<HttpServer> { if (!httpsOptions) { const { createServer } = await import('node:http') return createServer(app) } // #484 fallback to http1 when proxy is needed. if (proxy) { const { createServer } = await import('node:https') return createServer(httpsOptions, app) } else { const { createSecureServer } = await import('node:http2') return createSecureServer( { // Manually increase the session memory to prevent 502 ENHANCE_YOUR_CALM // errors on large numbers of requests maxSessionMemory: 1000, ...httpsOptions, allowHTTP1: true, }, // @ts-expect-error TODO: is this correct? app, ) } }

6. 静态资源代理 sirv

ts

体验AI代码助手

代码解读

复制代码

// packages/vite/src/node/server/index.ts const middlewares = connect() as Connect.Server middlewares.use(serveStaticMiddleware(server))


ts

体验AI代码助手

代码解读

复制代码

// packages/vite/src/node/server/middlewares/static.ts export function serveStaticMiddleware( server: ViteDevServer, ): Connect.NextHandleFunction { const dir = server.config.root const serve = sirv( dir, sirvOptions({ config: server.config, getHeaders: () => server.config.server.headers, }), ) // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` return function viteServeStaticMiddleware(req, res, next) { serve(req, res, next) } }


ts

体验AI代码助手

代码解读

复制代码

// packages/vite/src/node/server/middlewares/static.ts const sirvOptions = ({ config, getHeaders, disableFsServeCheck, }: { config: ResolvedConfig getHeaders: () => OutgoingHttpHeaders | undefined disableFsServeCheck?: boolean }): Options => { return { dev: true, etag: true, extensions: [], setHeaders(res, pathname) { if (knownJavascriptExtensionRE.test(pathname)) { res.setHeader('Content-Type', 'text/javascript') } const headers = getHeaders() if (headers) { for (const name in headers) { res.setHeader(name, headers[name]!) } } }, } }

总结

vite本地访问项目时, 通过 http、https、http2启动本地服务。 使用第三包包 connect 作为服务的中间件。 使用第三方包 sirv 做静态资源的代理


链接:https://juejin.cn/post/7503347659954159651

### 使用 `vite-plugin-mock` 配置开发服务器 在 Vite 项目中,可以通过插件 `vite-plugin-mock` 来实现 Mock 数据的功能。以下是关于如何配置该插件以支持开发服务器的相关说明。 #### 安装依赖 首先需要安装 `vite-plugin-mock` 插件到项目中: ```bash npm install vite-plugin-mock --save-dev ``` #### 配置插件 在项目的根目录下找到 `vite.config.js` 文件并引入 `vite-plugin-mock` 插件: ```javascript import { defineConfig } from 'vite'; import mockPlugin from 'vite-plugin-mock'; export default defineConfig({ plugins: [ mockPlugin({ // 启用mock功能 localEnabled: true, // 开发模式下启用本地mock }), ], }); ``` 上述代码片段展示了如何通过 `localEnabled` 属性来控制是否在开发环境中加载 Mock 功能[^2]。 #### 创建 Mock 接口文件 创建一个专门用于存储 Mock 数据的文件夹,例如 `mocks/` 或者按照官方推荐的方式,在 `tests/mocks/` 中新增接口数据文件。假设我们有一个简单的 Mock 接口 `/api/test` 返回 JSON 数据,则可以在 `mocks/api.test.ts` 文件中编写如下内容: ```typescript // mocks/api.test.ts export default { url: '/api/test', method: 'get', response: () => { return { code: 0, message: 'success', data: ['item1', 'item2'], }; }, }; ``` 此部分描述了如何定义一个 GET 请求的响应结构,并将其映射至指定路径下的 API 调用。 #### 测试 Mock 效果 启动开发服务器后访问对应的 URL 地址即可验证效果。如果一切正常运行,那么当浏览器发起针对 `/api/test` 的 HTTP 请求时会收到预设的数据作为回复。 对于更复杂的场景比如动态参数处理或者 POST 方法的支持也可以参照类似的逻辑扩展下去。 ```python print("Hello World") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值