Skip to content

Latest commit

 

History

History
40 lines (25 loc) · 1.89 KB

module_system.md

File metadata and controls

40 lines (25 loc) · 1.89 KB

Deno 模块系统

Deno 和 Node.js 其中一个最大的区别就是,Deno 采用分布式的模块依赖系统,和 Node.js 的 NPM 中心化模块系统不一样,Deno 不依赖某一个中心化的模块托管服务,如同浏览器,你依赖的 JS/TS 文件可以是随意分布在网络各处。就如同最初的前端页面,在 HTML 的 head 中通过 script 标签引入远程 JS 脚本。

例如我们可以直接引入远程模块

import { serve } from "https://deno.land/[email protected]/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

该代码片段直接引入了 https://deno.land/[email protected]/http/server.ts 这个文件,而无需像 Node.js 一样从 node_modules 中引入需要通过 npm 包管理先下载安装好的模块。

看起来似乎是将我们带到了 “远古时代”,其实只是回归到了浏览器本身,Deno 是完全兼容现在浏览器的标准模块系统 ESM

<script type="module" src="https://domain/somewhere/module.js"></script>

不必再忍受庞大的 node_modules 了

我们都知道,Node.js 在安装依赖的时候,会将整个依赖包所有文件下载下来。这会导致 node_modules 非常大。非常占磁盘空间,并且如果们使用 Node.js 交付服务端项目,将 node_modules 打包到 Docker 镜像中,也会使我们的镜像变得非常大。这是一件极其痛苦的事情。

注:snowpack 是个非常有意思的工具,可以极大的改善 node_modules 体积大的问题,并且 snowpack 也是致力于推动 esm 标准。

Deno 最小的依赖单元是文件,而 NPM 的依赖单元是整个包。就如同树叶和树枝:

Deno 的依赖单元

Deno

NPM 的依赖单元

NPM