前言
Deno 是一个由 Node.js 创始人 Ryan Dahl 所开发的运行时环境,它是一个现代的、安全的 TypeScript 运行环境。相比于 Node.js,Deno 支持直接运行 TypeScript,同时也提供了更加友好的 API 和更好的安全性。
本文主要讨论在 Deno 中使用 ES6 模块时会遇到的问题,以及如何解决这些问题。
陷阱
模块路径不符合规范
在 Node.js 中,我们使用 CommonJS 的 require()
来加载模块,而加载的时候通常使用相对或绝对路径。当我们使用 ES6 的 import
来加载模块的时候,我们的路径必须包含扩展名。
例如,以下代码在 Node.js 中是正常的:
const testModule = require('./test');
而在 Deno 中,我们使用 ES6 的 import
来加载模块,路径必须包含扩展名,否则会抛出错误:
import { testModule } from './test.ts';
缺少文件扩展名
除了模块路径必须包含扩展名之外,Deno 同样要求我们在 import
语句中显式指定模块的扩展名,否则会抛出错误:
import { testModule } from './test'; // 抛出错误 import { testModule } from './test.ts'; // 正常
缺少必要的 TypeScript 配置
Deno 本身是对 TypeScript 很友好的,事实上,它可以直接运行 TypeScript 文件而无需任何构建工具。但是,有时候我们会遇到一些奇怪的问题,例如:
export function test() {}
然后我们在另一个文件中使用 import
来加载这个模块,但是却遇到了以下错误:
Cannot resolve module 'xxx' in 'path/to/file'
这时候,我们需要在项目根目录创建一个 tsconfig.json
文件并配置它:
{ "compilerOptions": { "target": "es6", "module": "es6", "moduleResolution": "node" } }
通过以上配置,我们可以指定 TypeScript 的编译目标为 ES6,以及将模块解析为 Node.js 风格,同时也可以解决以上的问题。
解决方案
添加必要的扩展名
为了解决模块路径不符合规范的问题,我们需要在导入模块时添加必要的扩展名:
import { testModule } from './test.ts';
配置 TypeScript
如果你遇到了无法访问模块的问题,可以尝试添加必要的 TypeScript 配置,如下:
{ "compilerOptions": { "target": "es6", "module": "es6", "moduleResolution": "node" } }
然后在终端中运行以下命令:
deno run --allow-read --allow-net --config=path/to/tsconfig.json path/to/file.ts
需要注意的是,Deno 中访问文件系统和网络是需要显式进行授权的,因此我们需要在运行时添加相关权限。
总结
Deno 是一个新的运行时环境,与 Node.js 有所不同,需要开发者注意一些细节问题。本文介绍了在使用 ES6 模块时可能遇到的问题以及对应的解决方案。希望能对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fda1f895b1f8cacdceba14