Vite study

总览

Vite(法语意为 "快速的",发音 /vit/[图片上传失败...(image-7771a7-1647833168481)] ,发音同 "veet")是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:

  • 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。

  • 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

Vite 意在提供开箱即用的配置,同时它的 插件 API 和 JavaScript API 带来了高度的可扩展性,并有完整的类型支持。
你可以在 为什么选 Vite 中了解更多关于项目的设计初衷。


Vue 第一优先级支持

Vite 最初是作为 Vue.js 开发工具的未来基础而创建的。尽管 Vite 2.0 版本完全不依赖于任何框架,但官方 Vue 插件仍然对 Vue 的单文件组件格式提供了第一优先级的支持,涵盖了所有高级特性,如模板资源引用解析、

你可以使用任何你喜欢的占位标记来替代 ,只要它能够被正确替换。

情景逻辑

如果需要执行 SSR 和客户端间情景逻辑,可以使用:

if ( import.meta.env.SSR ) {
  // ... 仅在服务端执行的逻辑
}

这是在构建过程中被静态替换的,因此它将允许对未使用的条件分支进行摇树优化。

设置开发服务器

在构建 SSR 应用程序时,你可能希望完全控制主服务器,并将 Vite 与生产环境脱钩。因此,建议以中间件模式使用 Vite。下面是一个关于 express 的例子:

# server.js
const fs = require('fs')
const path = require('path')
const express = require('express')
const { createServer: createViteServer } = require('vite')

async function createServer() {
  const app = express()

  // 以中间件模式创建 Vite 应用,这将禁用 Vite 自身的 HTML 服务逻辑
  // 并让上级服务器接管控制
  //
  // 如果你想使用 Vite 自己的 HTML 服务逻辑(将 Vite 作为
  // 一个开发中间件来使用),那么这里请用 'html'
  const vite = await createViteServer({
    server: { middlewareMode: 'ssr' }
  })
  // 使用 vite 的 Connect 实例作为中间件
  app.use(vite.middlewares)

  app.use('*', async (req, res) => {
    // 服务 index.html - 下面我们来处理这个问题
  })

  app.listen(3000)
}

createServer()

这里 vite 是 ViteDevServer 的一个实例。vite.middlewares 是一个 Connect 实例,它可以在任何一个兼容 connect 的 Node.js 框架中被用作一个中间件。

下一步是实现 * 处理程序供给服务端渲染的 HTML:

app.use('*', async (req, res) => {
  const url = req.originalUrl

  try {
    // 1. 读取 index.html
    let template = fs.readFileSync(
      path.resolve(__dirname, 'index.html'),
      'utf-8'
    )

    // 2. 应用 Vite HTML 转换。这将会注入 Vite HMR 客户端,
    //    同时也会从 Vite 插件应用 HTML 转换。
    //    例如:@vitejs/plugin-react-refresh 中的 global preambles
    template = await vite.transformIndexHtml(url, template)

    // 3. 加载服务器入口。vite.ssrLoadModule 将自动转换
    //    你的 ESM 源码使之可以在 Node.js 中运行!无需打包
    //    并提供类似 HMR 的根据情况随时失效。
    const { render } = await vite.ssrLoadModule('/src/entry-server.js')

    // 4. 渲染应用的 HTML。这假设 entry-server.js 导出的 `render`
    //    函数调用了适当的 SSR 框架 API。
    //    例如 ReactDOMServer.renderToString()
    const appHtml = await render(url)

    // 5. 注入渲染后的应用程序 HTML 到模板中。
    const html = template.replace(``, appHtml)

    // 6. 返回渲染后的 HTML。
    res.status(200).set({ 'Content-Type': 'text/html' }).end(html)
  } catch (e) {
    // 如果捕获到了一个错误,让 Vite 来修复该堆栈,这样它就可以映射回
    // 你的实际源码中。
    vite.ssrFixStacktrace(e)
    console.error(e)
    res.status(500).end(e.message)
  }
})

package.json 中的 dev 脚本也应该相应地改变,使用服务器脚本:

"scripts": {
-   "dev": "vite"
+   "dev": "node server"
  }

生产环境构建

为了将 SSR 项目交付生产,我们需要:

  1. 正常生成一个客户端构建;
  2. 再生成一个 SSR 构建,使其通过 require() 直接加载,这样便无需再使用 Vite 的 ssrLoadModule
    package.json 中的脚本应该看起来像这样:
{
  "scripts": {
    "dev": "node server",
    "build:client": "vite build --outDir dist/client",
    "build:server": "vite build --outDir dist/server --ssr src/entry-server.js "
  }
}

注意使用 --ssr 标志表明这将会是一个 SSR 构建。同时需要指定 SSR 的入口。

接着,在 server.js 中,通过 process.env.NODE_ENV 条件分支,需要添加一些用于生产环境的特定逻辑:

  • 使用 dist/client/index.html 作为模板,而不是根目录的 index.html,因为前者包含了到客户端构建的正确资源链接。

  • 使用 require('./dist/server/entry-server.js') ,而不是 await vite.ssrLoadModule('/src/entry-server.js')(前者是 SSR 构建后的最终结果)。

  • vite 开发服务器的创建和所有使用都移到 dev-only 条件分支后面,然后添加静态文件服务中间件来服务 dist/client 中的文件。

可以在此参考 Vue 和 React 的设置范例。

生成预加载指令

略过

预渲染 / SSG

如果预先知道某些路由所需的路由和数据,我们可以使用与生产环境 SSR 相同的逻辑将这些路由预先渲染到静态 HTML 中。这也被视为一种静态站点生成(SSG)的形式。查看 示例渲染代码 获取有效示例。

SSR 外部化

略过

SSR 专有插件逻辑

一些框架,如 Vue 或 Svelte,会根据客户端渲染和服务端渲染的区别,将组件编译成不同的格式。可以向以下的插件钩子中,给 Vite 传递额外的 options 对象,对象中包含 ssr 属性来支持根据情景转换:

  • resolveId
  • load
  • transform
    ...

SSR Target

SSR 构建的默认目标为 node 环境,但你也可以让服务运行在 Web Worker 上。每个平台的打包条目解析是不同的。你可以将ssr.target 设置为 webworker,以将目标配置为 Web Worker。

SSR Bundle

在某些如 webworker 运行时等特殊情况中,你可能想要将你的 SSR 打包成单个 JavaScript 文件。你可以通过设置 ssr.noExternal 为 true 来启用这个行为。这将会做两件事:

  • 将所有依赖视为 noExternal(非外部化)
  • 若任何 Node.js 内置内容被引入,将抛出一个错误

后端集成

如果你想使用传统的后端(如 Rails, Laravel)来服务 HTML,但使用 Vite 来服务其他资源,可以查看在 Awesome Vite 上的已有的后端集成列表。

如果你需要自定义集成,你可以按照本指南的步骤配置它:
略过


与其它非打包解决方案比较

略过


插件 API

略过


HMR API

注意
这里是客户端 HMR API。若要在插件中处理 HMR 更新,详见 handleHotUpdate。
手动 HMR API 主要用于框架和工具作者。作为最终用户,HMR 可能已经在特定于框架的启动器模板中为你处理过了。

Vite 通过特殊的 import.meta.hot 对象暴露手动 HMR API。
略过


JavaScript API

Vite 的 JavaScript API 是完全类型化的,我们推荐使用 TypeScript 或者在 VSCode 中启用 JS 类型检查来利用智能提示和类型校验。

createServer 类型签名:

InlineConfig#

ViteDevServer

build

preview

resolveConfig

transformWithEsbuild

配置 Vite

配置文件解析

当以命令行方式运行 vite 时,Vite 会自动解析 项目根目录 下名为 vite.config.js 的文件

配置智能提示

因为 Vite 本身附带 Typescript 类型,所以你可以通过 IDE 和 jsdoc 的配合来实现智能提示

情景配置

如果配置文件需要基于(dev/servebuild)命令或者不同的 模式 来决定选项,则可以选择导出这样一个函数

异步配置

共享配置

vite.config.js的全部配置都在这里

开发服务器选项

    • server.host
    • server.port
    • server.strictPort
    • server.https
    • server.open
    • server.proxy
    • server.cors
    • server.force
    • server.hmr
    • server.watch
    • server.middlewareMode
    • server.fs.strict
    • server.fs.allow
    • server.fs.deny
    • server.origin

构建选项

预览选项

依赖优化选项

SSR 选项

插件

官方插件#

@vitejs/plugin-vue#

  • 提供 Vue 3 单文件组件支持

@vitejs/plugin-vue-jsx#

  • 提供 Vue 3 JSX 支持(通过 专用的 Babel 转换插件)。

@vitejs/plugin-react#

  • 提供完整的 React 支持

@vitejs/plugin-legacy#

  • 为打包后的文件提供传统浏览器兼容性支持

Rollup 插件

Vite 插件 是 Rollup 插件接口的一种扩展。查看 Rollup 插件兼容性章节 获取更多信息。

你可能感兴趣的:(Vite study)