【问题标题】:How to use import-map with Deno如何在 Deno 中使用 import-map
【发布时间】:2022-12-24 13:46:46
【问题描述】:

我有这个 import_map.json 文件:

{
  "imports": {
    "node_modules/" : "./node_modules"
  }
}

在高层次上,我正在尝试为 Deno 和 Node 的 .ts 文件创建一些兼容性。

我的导入看起来像这样:

import * as util from 'util';
import chalk from "node_modules/chalk";

当我运行这个:

deno run --import-map='import_map.json' ./src/linked-queue.ts

我收到这个令人讨厌的错误:

Import map diagnostics:
  - Invalid target address "file:///.../linked-queue/node_modules" for package specifier "node_modules/". Package address targets must end with "/".
error: Blocked by null entry for ""node_modules/""
    at file:///.../linked-queue/src/linked-queue.ts:4:19

任何人都知道如何解决这个错误?

【问题讨论】:

标签: node.js typescript deno import-maps


【解决方案1】:
  "imports": {
    "node_modules/" : "./node_modules/"
  }

在目标说明符上添加尾部斜线。另见the specthe source

【讨论】:

  • 是的,我收到一个新错误:error: Relative import path "node_modules/chalk" not prefixed with / or ./ or ../ at file:///.../linked-queue/src/linked-queue.ts:4:19
  • 我看到了几个问题。其一,chalk 不起作用,因为 deno 不完全正确地支持 Node 样式的模块解析see the roadmap——它给出了一个Is a directory错误,因为 Deno 不尊重 chalk 包中的main。您可以通过在 node_modules 中添加任意 TypeScript 文件并导入来测试它,它会正常工作。其次,chalk 本身不能与 Deno 一起使用,因为它有自己的导入映射,这些导入映射与 CLI 上指定的映射相冲突。
  • 总而言之,Deno 似乎并没有真正为 node_modules 互操作做好准备。 XKCD 927。
  • 是的,我猜不是,这很好,可以理解
【解决方案2】:

该手册在以下三个部分中介绍了这种情况:

我将展示一个可重现的示例,而不是复制 + 粘贴文档中的所有内容(因为一些复制的 sn-ps 还不够;这是一个多方面的问题)——但是请注意导入映射中的值,因为它们是通过阅读文档的所有三个链接部分得出的:

./import_map.json:

{
  "imports": {
    "chalk": "npm:chalk@5.2.0",
    "node:util": "https://deno.land/std@0.170.0/node/util.ts"
  }
}

./deno.jsonc:

{
  "importMap": "./import_map.json",
  "tasks": {
    // I included these permissions (which are required by chalk) in advance to avoid needing to grant them one-by-one at runtime:
    "dev": "deno run --allow-env=FORCE_COLOR,TF_BUILD,TERM,CI,TEAMCITY_VERSION,COLORTERM,TERM_PROGRAM,TERM_PROGRAM_VERSION src/linked-queue.ts"
  }
}

./src/linked-queue.ts:

import * as util from "node:util";
import chalk from "chalk";

console.log('util:', typeof util); // util: object
console.log('chalk:', typeof chalk); // chalk: function

使用定义的任务在终端中运行:

% deno --version
deno 1.29.1 (release, x86_64-apple-darwin)
v8 10.9.194.5
typescript 4.9.4

% deno task dev
Task dev deno run --allow-env=FORCE_COLOR,TF_BUILD,TERM,CI,TEAMCITY_VERSION,COLORTERM,TERM_PROGRAM,TERM_PROGRAM_VERSION src/linked-queue.ts
util: object
chalk: function

% echo $?
0

到目前为止,Deno 的一切都很好。


让我们检查一下相同的代码在 Node.js 中是否可以不加修改地工作。需要添加以下文件才能使用 Node 进行编译和运行,因为它不包含 Deno 的所有内置工具:

./package.json:

{
  "name": "so-74905332",
  "version": "0.1.0",
  "type": "module",
  "scripts": {
    "compile": "tsc",
    "dev": "tsc && node src/linked-queue.js"
  },
  "license": "MIT",
  "dependencies": {
    "chalk": "5.2.0"
  },
  "devDependencies": {
    "@types/node": "^18.11.17",
    "typescript": "^4.9.4"
  }
}

./tsconfig.json:

为什么有这些值?我只是使用 recommended base,链接到 TS repo wiki

// This file was autogenerated by a script
// Equivalent to a config of: strictest extends esm extends node18
{
  "$schema": "https://json.schemastore.org/tsconfig",
  "display": "Node LTS + ESM + Strictest",
  "_version": "18.12.1",
  "compilerOptions": {
    "lib": [
      "es2022"
    ],
    "module": "es2022",
    "target": "es2022",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "moduleResolution": "node",
    "allowUnusedLabels": false,
    "allowUnreachableCode": false,
    "exactOptionalPropertyTypes": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitOverride": true,
    "noImplicitReturns": true,
    "noPropertyAccessFromIndexSignature": true,
    "noUncheckedIndexedAccess": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "importsNotUsedAsValues": "error",
    "checkJs": true
  }
}

使用定义的 npm 脚本在终端中运行:

% node --version
v18.12.1

% npm install

added 3 packages, and audited 4 packages in 1s

1 package is looking for funding
  run `npm fund` for details

found 0 vulnerabilities

% npm run dev

> so-74905332@0.1.0 dev
> tsc && node src/linked-queue.js

util: object
chalk: function

% echo $?
0

相同的模块源代码也适用于 Node.js。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2020-09-01
    • 2020-10-31
    • 2020-09-24
    • 2021-04-24
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多