Deno的包管理工具和软件注册中心JSR(JavaScript Registry),和npm类似.可以在https://jsr.io/
中搜索需要的包
安装使用
deno add @tlevi/lodash
像导入任何其他 ES 模块一样导入包:
import * as mod from "@tlevi/lodash";
使用方法
npx jsr add @tlevi/lodash
import env from "@tlevi/lodash";
env.isPad()
为什么要有JSR
为什么有了 npm 还要做 JSR?
- ESM 模块现在已经成为标准,CommonJS 正在逐渐被取代。
- 越来越多不在依靠浏览器运行 JS 运行时的出现。JSR 模块可用于 Node.js、Deno、Bun、Cloudflare Workers 等
- TypeScript 不仅作为一种带有编译时类型检查的编写 JavaScript 的方式出现,而且作为 TC39 最新 JavaScript 语言特性的测试平台。
JSR 现在的特点:
- 将 ESM 作为 JavaScript 模块的 web 标准 , 不在支持 CommonJS。
- 从一开始就为 TypeScript 设计,原生支持 TS 的运行时,会直接使用 TS 文件。
- 跨运行时支持。JSR 不是为 Node 或 Deno 而生,而是为所有 JS 运行时而生。
- 兼容 npm。JSR 做了个 npm 兼容层,JSR 并不是 npm 注册表的替代品;而是 它是 npm 的超集。
在 JSR 上发布第一个包
首先看一下JSR包的规则
- 仅 ESM 模块:JSR 包作为 ESM 模块发布。这意味着您只能发布使用
import
和export
关键字的模块。您无法发布 CommonJS 模块。 - 支持 npm 包:您可以通过在
dependencies
您的中指定它们来依赖 npm 包package.json
,或者使用npm:
诸如import { cloneDeep } from "npm:lodash@4";
. - 支持 jsr 包
dependencies
:您可以通过在 的中指定 JSR 包来依赖 JSR 包,或者使用如下说明符package.json
在代码中引用它们:jsr:``import { encodeBase64 } from "jsr:@std/encoding@1/base64";
node:
支持内置插件:您可以使用该方案导入 Node.js 内置插件node:
。例如,您可以fs
使用 导入模块import { readFile } from "node:fs";
。如果您的包有package.json
,您还可以使用裸说明符(不带前缀)导入 Node.js 内置程序node:
。- 简单文件名:文件名必须与 Windows 和 Unix 兼容。这意味着文件名不能包含
*
、:
、 或 等字符?
。您也可能没有多个同名但大小写不同的文件。 - 最好不要使用 TypeScript“慢速类型” :为了加快类型检查、支持文档生成和 Node.js 兼容性,JSR 包不应在导出的函数、类或变量中使用某些 TypeScript 类型。这是默认强制执行的,但可以选择退出。
- 有效的跨文件导入:包中模块之间的所有相对导入必须在发布时解析。支持的说明符的格式取决于 a 是否
package.json
正在使用,并在下面详细说明。
编写代码
创建这种结构的文件,
jsr.json/deno.js:配置文件
mod.ts:具体的实现代码
这俩是固定的写发
我们在mod.ts中写一个数组过滤的功能
//mod.ts
export function filterArray(arr: number[], condition: (item: number) => boolean): number[] {
return arr.filter(condition);
}
该文件是配置文件
//jsr.json
{
"name": "@fofo/filter-array",
"version": "0.1.0",
"exports": "./mod.ts"
}
上面就是 jsr.json
的内容,exports
是入口文件,name 这里分两个部分,scope 和 包名,这里我用了我的用户名 @fofo
,scope 类似 npm 的组织,需要在 jsr.io 上创建,目前试用阶段,每个账号最多创建 3个 scope。
通过 CLI 发布
deno publish
执行完成之后会弹出该页面 点击 Approve 授权,就发布成功啦。
这样就可以在jsr.io/搜到我们刚刚发布的包了
到此发布的第一个JSR完成了