迁移到新一代 Vite/webpack5 + esbuild 体系)
Nuxt 构建工具链迁移指南从 Nuxt 2webpack Babel迁移到新一代 Vite/webpack5 esbuild 体系【免费下载链接】nuxtthe full-stack Vue framework项目地址: https://gitcode.com/GitHub_Trending/nu/nuxtNuxt 3 起对构建工具链进行了彻底重构默认采用 Vite 或 webpack 5、Rollup、PostCSS、esbuild 组合取代了 Nuxt 2 时代以 webpack 4 Babel 为核心的构建体系并内置了 TypeScript 支持。本文基于官方迁移指南 docs/7.migration/10.bundling.md结合本仓库 schema 源码逐项说明哪些旧配置会被忽略、如何通过新的顶级配置键接管构建工具以及完成迁移所需的清理步骤与注意事项帮助读者平稳落地到全新的打包体系。新构建体系概览默认工具与职责分工从 Nuxt 2 迁移到 Nuxt 3最直观的变化是底层打包技术栈整体换代。当前 Nuxt 默认使用以下构建工具Vite 或 webpack负责应用代码的模块打包与开发服务器Rollup用于服务端产物与依赖预打包nitro 服务端构建的基础PostCSS负责 CSS 后处理自动加前缀、压缩等esbuild提供极速的转译能力TypeScript/JSX 剥离、压缩等。这一组合在仓库依赖层面有直接体现根目录 package.json 的 devDependencies 中同时声明了vite、webpack、rollup三套工具链catalog 管理版本而packages/vite、packages/webpack、packages/vite-server等目录则承载了各构建器的实现逻辑。配套的Nuxt 3 原生内置 TypeScript 支持无需再通过额外模块引入。这一变革的完整背景可参考 迁移总览技术栈从 Vue 2 到 Vue 3、从 webpack 4 Babel 到 Vite/webpack 5 esbuild服务端也从运行时依赖 Nuxt 变为由 nitropack 编译的独立最小化 server。旧build配置的废弃哪些配置不再生效由于上述工具链的更替Nuxt 2 中绝大部分写在build键下的配置在新版本中会被直接忽略其中最典型的是自定义 Babel 配置。在 Nuxt 2 中常见的 Babel 定制写法大致如下迁移后无效export default { build: { babel: { presets: [nuxt/babel-preset-app], plugins: [babel/plugin-transform-runtime], }, }, }新版本不再按此方式承载 Babel 选项默认转译路径已由 esbuild 接管Vite 构建器对 Vue SFC 的处理走 Vue 编译器内部逻辑见下文对 vite.ts 的解析不再暴露统一的 Babel 定制口子。「需要配置构建工具时怎么办」迁移指南给出的答案是使用nuxt.config中新的顶层键vite、webpack和postcss分别接管对应工具。这三个键的默认值与解析逻辑均可在本仓库packages/schema/src/config/下找到vite→ vite.tswebpack→ webpack.tspostcss→ postcss.ts注意仓库中配置解析入口 config/index.ts 还暴露了esbuild与build等键其中build仅保留transpile、analyze等少量跨构建器通用能力详见下文Babel 相关的语义已彻底移除。构建器选择默认 Vite可切换 webpack旧版本构建器的选择方式也随之变化。在 build.ts 中builder键会把字符串映射到对应的构建器包const map { rspack: nuxt/rspack-builder, vite: nuxt/vite-builder, webpack: nuxt/webpack-builder, } // 未配置时默认返回 map.vite即 nuxt/vite-builder也就是说当前仓库默认使用 Vite如需回到 webpack 语义可显式声明builder: webpack对应nuxt/webpack-builder并配合顶层webpack键进行配置。这也解释了为什么 webpack.ts 仍保留了完整的分包命名、loader、extractCSS等旧式选项——它们服务于选择 webpack 构建器时的用户。对应地esbuild.ts 中 esbuild 的默认 target 会根据当前 builder 动态解析Vite 下为esnext非 Vite 构建器且启用 decorators 实验特性时才降级到es2024。保留的通用build能力即便在 Nuxt 3build键也并未被完全移除只是范围大幅收窄。从 build.ts 的解析逻辑看以下通用能力仍然保留且被内部默认值填充build.transpile声明需要转译的依赖支持字符串、正则或回调函数例如build: { transpile: [some-dep] }build.analyze启用打包体积分析默认输出 treemap 模板到analyzeDir下的{name}.htmloptimization面向useState、useFetch、useAsyncData等关键组合式函数的 tree-shaking 与异步转换优化如对defineNuxtPlugin、definePageMeta的 asyncTransforms其默认清单同样在 build.ts 中维护。因此迁移时无需把旧build下的全部配置丢弃但需甄别与 Babel、webpack 4 loader 相关的部分应移除或迁移至顶层vite/webpack键。Vite 顶层配置默认值与常用定制点vite键透传给 Vite同时 Nuxt 会注入一批默认值。从 vite.ts 的 resolver 可以看出几个值得注意的默认行为vite.define自动注入process.dev/import.meta.dev、process.test/import.meta.test、__VUE_OPTIONS_API__等编译期常量值与dev、test、debug及vue.optionsApi联动vite.resolve.extensions默认在 JS 扩展名基础上追加.vue、.jsonvite.publicDir被强制固定为false并触发一条 schema 诊断——Nuxt 不希望用户自行配置 Vite 的 publicDir静态资源统一交给 Nuxt 的public/目录这与 目录结构文档 中public/目录的定位一致vite.build.assetsDir默认取自app.buildAssetsDir去掉前导/并设置emptyOutDir: false以保护产物目录vite.cacheDir默认解析到node_modules/.cache/vitemonorepo 场景下会考虑 workspace 布局vite.server.fs.allow自动合并 buildDir、srcDir、rootDir、workspaceDir 白名单允许在开发服务器中访问这些目录。示例迁移后若需修改 Vite 的解析别名或关闭依赖预构建的某个排除项export default defineNuxtConfig({ vite: { resolve: { alias: { ~my-lib: /path/to/my-lib, }, }, optimizeDeps: { // vue-demi 默认已被排除这里再补充自定义排除项 exclude: [my-optional-dep], }, }, })PostCSS 配置迁移从build.postcss到顶层postcssNuxt 2 中 PostCSS 配置位于build.postcss下新版本则统一收口到顶层postcss键。其默认解析逻辑见 postcss.tsplugins默认空对象由用户按需声明如autoprefixer、cssnano提供一个特殊的order选项用于控制插件执行顺序。它支持三种形式字符串预设名、函数或数组。内置预设包括cssnanoLast把cssnano排到最后、autoprefixerLast把autoprefixer排到最后以及默认采用的autoprefixerAndCssnanoLast两者均排到最后确保压缩与加前缀在管道末尾执行。传入非法预设名时 resolver 会抛出 schema 诊断NUXT_B5015。迁移示例export default { build: { postcss: { plugins: { autoprefixer: {}, }, }, }, }export default defineNuxtConfig({ postcss: { plugins: { autoprefixer: {}, cssnano: {}, }, // 默认已保证 autoprefixer 与 cssnano 位于末尾可按需覆盖 }, })渐进式迁移步骤四步清理清单迁移指南为 Nuxt 2 项目升级到新构建体系给出了明确的四步操作以下逐一展开说明1. 移除nuxt/typescript-build与nuxt/typescript-runtimeNuxt 3 原生内置 TypeScript 支持构建器与运行期都已集成 TS 转译能力无需再引入这两个 Nuxt 2 专用模块。请将它们从package.json的 dependencies 以及nuxt.config的modules/buildModules中一并删除。关于新版本 TypeScript 集成方式的详细说明可参阅仓库中的 TypeScript 概念指南Nuxt 会自动生成类型、提供编辑器提示并可通过nuxi typecheck配合vue-tsc做类型检查详见 迁移配置文档 中 tsconfig 一节。2. 移除项目中不再使用的 Babel 依赖既然默认转译路径已切换为 esbuild及 Vite 内置转换旧项目中为了兼容 webpack 4 引入的babel/*系列依赖如babel/core、babel/preset-env、babel/runtime及各类 Babel 插件均可移除。同时删除nuxt.config中已被忽略的build.babel配置以及.babelrc/babel.config.js等文件除非项目里仍有其他非 Nuxt 工具链在使用它们。3. 移除显式的core-js依赖Nuxt 2 时代常需显式安装core-js并配置 polyfill 行为新构建链默认输出面向现代浏览器的产物并将 polyfill 决策交由构建器与目标环境处理因此应从依赖中移除显式的core-js声明避免与内置处理产生冲突。4. 将require迁移为import新框架全面 ESM 化相关概念参见 ESM 指南。迁移时需把源码与配置中的 CJS 写法改为 ESM 写法// 迁移前CommonJS const fs require(node:fs) const lib require(my-lib) module.exports { ... } // 迁移后ESM import fs from node:fs import lib from my-lib export default { ... }这一要求同样适用于nuxt.config文件本身应使用defineNuxtConfigexport default并避免在其中使用require/module.exports详见 迁移配置文档 的 ESM Syntax 小节。迁移前后配置对照速览关注点Nuxt 2旧Nuxt 3新依据应用打包webpack 4 BabelVite默认或 webpack 5 esbuildbuild.ts 默认builder: viteBabel 配置build.babel已忽略不再提供入口docs/7.migration/10.bundling.md构建器选项build.*顶层vite/webpack/postcss键vite.tsPostCSSbuild.postcss顶层postcsspostcss.tsTypeScriptnuxt/typescript-build/-runtime内建支持配合nuxi typecheckTypeScript 指南Polyfill显式core-js移除显式依赖本指南 Steps模块语法requireimport全面 ESMESM 指南通用转译build.transpile仍可用build.transpile保留build.ts迁移后的验证建议完成上述清理后建议依次执行以下验证以确认构建链路已完全切换到新体系删除node_modules中残留的 Babel / core-js / typescript-build 相关包并重新安装依赖运行开发服务器nuxi dev确认 Vite或所选 webpack 构建器能正常启动、热更新生效执行生产构建nuxi build确认 SSR 产物经由 Rollup/ nitro 正确产出并检查build.transpile中声明的外部依赖是否被正确转译运行nuxi typecheck配合vue-tsc验证类型正确性确认已无nuxt/typescript-*运行期介入。整个迁移的核心判断标准只有一个旧的build Babel 心智模型彻底让位于 顶层vite/webpack/postcss键 内建 TypeScript ESM 优先 的新模型。只要围绕新模型的配置键做定制、把上表列出的旧依赖与旧语法清理干净即可顺利完成构建工具链的升级。【免费下载链接】nuxtthe full-stack Vue framework项目地址: https://gitcode.com/GitHub_Trending/nu/nuxt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考