- 配置参考 Configuration
- 入门指南
- 介绍 Introduction
- 安装 Installation
- 配置 Configuration
- 视图 Views
- 资产 Assets
- 路由 Routing
- SEO and Meta
- 过渡 Transitions
- 数据获取 Data Fetching
- 状态管理 State Management
- 错误处理 Error handling
- 层结构 Layers
- 部署 Deployment
- 测试 Testing
- 升级指南 Upgrade Guide
- 核心概念
- 自动导入 Auto imports
- Vue.Js Vue.js Development
- 渲染模式 Rendering Modes
- 服务端引擎 Server Engine
- 模块化 Modules
- ES模块 ES Modules
- TypeScript TypeScript
- 目录结构
- 可组合项
- 组件
- 工具库
- fetch
- abortNavigation
- addRouteMiddleware
- clearError
- clearNuxtData
- createError
- defineNuxtComponent
- defineNuxtRouteMiddleware
- definePageMeta
- navigateTo
- onBeforeRouteLeave
- onBeforeRouteUpdate
- onNuxtReady
- prefetchComponents
- preloadComponents
- preloadRouteComponents
- refreshNuxtData
- reloadNuxtApp
- setPageLayout
- setResponseStatus
- showError
- updateAppConfig
- CLI 命令
- 进阶
- 深入探究
- 迁移指南
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
ES模块 ES Modules
本指南有助于解释什么是 ES 模块以及如何使 Nuxt 应用程序(或上游库)与 ESM 兼容。
本篇背景
Nuxt 3(和 Bridge)使用原生 ES 模块。
CommonJS Modules
如果遇到这些错误,几乎可以肯定是上游库的问题。 他们需要修复他们的库 以支持由 Node.js 导入。
转译库
好消息是修复 ESM 兼容性问题相对简单。 有两个主要选项:
- 您可以将 ESM 文件重命名为以
.mjs
结尾。
这是推荐的最简单的方法。 您可能需要解决库的依赖项问题,可能还需要解决构建系统的问题,但在大多数情况下,这应该可以解决问题。 还建议将 CJS 文件重命名为以.cjs
结尾,以获得最大的明确性。 - 您可以选择将整个图书馆设为 ESM-only。
这意味着在您的package.json
中设置type: 'module'
并确保您构建的库使用 ESM 语法。 但是,您可能会遇到依赖项问题 - 这种方法意味着您的库 只能 在 ESM 上下文中使用。
迁移
从 CJS 到 ESM 的第一步是更新任何对 require
的使用,改为使用 import
:
module.exports = ...
exports.hello = ...
ESMexport default ...
export const hello = ...
CJSconst myLib = require('my-lib')
ESMimport myLib from 'my-lib'
// or
const myLib = await import('my-lib').then(lib => lib.default || lib)
在 ESM 模块中,与 CJS 不同,require
、require.resolve
、__filename
和 __dirname
全局变量不可用 并且应该替换为 import()
和 import.meta.filename
。
import { join } from 'path'
const newDir = join(__dirname, 'new-dir')
ESMimport { fileURLToPath } from 'node:url'
const newDir = fileURLToPath(new URL('./new-dir', import.meta.url))
CJSconst someFile = require.resolve('./lib/foo.js')
ESMimport { resolvePath } from 'mlly'
const someFile = await resolvePath('my-lib', { url: import.meta.url })
最佳实践
- 更喜欢命名导出而不是默认导出。 这有助于减少 CJS 冲突。 (参见 默认导出 部分)
- 尽可能避免依赖 Node.js 内置插件和 CommonJS 或 Node.js-only 依赖项,以使您的库可在浏览器和 Edge Workers 中使用,而无需 Nitro polyfill。
- 使用带有条件导出的新“导出”字段。 (阅读更多)。
{
"exports": {
".": {
"import": "./dist/mymodule.mjs"
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论