CSDN|Deno 是面向代码的浏览器?( 三 )
依赖管理 我认为我们需要坦率地谈谈npm生态系统中的依赖关系 。 老实说 , 它很有问题 。 一个生态系统让这五行代码(https://github.com/juliangruber/isarray/blob/master/index.js)在过去9年中被下载了3000万次 , 而这段代码的功能早已存在于每个浏览器中 , Node.js也从来不用 , 那这个生态系统就就有问题 。 在这个例子中 , 实际代码仅有132个字节 , 但包大小为3.4kb 。 可运行代码仅占程序包大小的3.8% 。 “不用担心!” 我认为这涉及好几个因素 。 其主要原因是 , 这个模型是反的 , 这一点我说过Deno是代码的浏览器 。 问题是 , 反向的模型影响了我们创建网站的方式 。 如果没有中央仓库 , 那么创建网站时 , 我们会下载所有依赖的代码 , 然后上传到服务器上 , 然后每个用户将一堆代码下载到本地计算机上 。 一些证据表明 , 所下载的代码中只有大约10%是该站点或Web应用程序所独有的 , 其余的是我们正在下载到开发工作站并捆绑在一起的所有代码 。 这种有问题的模型正是Snowpack等解决方案试图解决的问题 。另一个重要的问题是我们的依赖项没有与代码耦合 。 我们将依赖关系放入package.json中 , 但它与代码是否实际使用了这些依赖完全无关 。 虽然我们的代码表示了其他代码中正在使用的内容 , 但它与该代码的版本非常松散地耦合在一起 。 这种耦合关系包含在package.json中 , 它对我们编写的代码影响最大 , 因为只有它才是实际上消费依赖项的代码 。因此我们提出了Deno模型 , 我喜欢称之为Deps-in-JS , 因为所有酷的代码都叫* -in-JS 。 Deno将外部依赖明确地表示为URL意 , 这意味着依赖关系简洁明了 , 并且代码和依赖关系紧密地耦合在一起 。 如果要查看依赖关系图 , 只需执行deno info并指定本地或远程模块:$ deno info https://deno.land/x/oak/examples/server.tslocal: $deno/deps/https/deno.land/d355242ae8430f3116c34165bdae5c156dca21aeef521e45acb51fcd21c9f724type: TypeScriptcompiled: $deno/gen/https/deno.land/x/oak/examples/server.ts.jsmap: $deno/gen/https/deno.land/x/oak/examples/server.ts.js.mapdeps:├── https://deno.land/std@0.53.0/fmt/colors.ts└─┬ https://deno.land/x/oak/mod.ts├─┬ https://deno.land/x/oak/application.ts│ ├─┬ https://deno.land/x/oak/context.ts│ │ ├── https://deno.land/x/oak/cookies.ts│ │ ├─┬ https://deno.land/x/oak/httpError.ts│ │ │ └─┬ https://deno.land/x/oak/deps.ts│ │ │ ├── https://deno.land/std@0.53.0/hash/sha256.ts│ │ │ ├─┬ https://deno.land/std@0.53.0/http/server.ts│ │ │ │ ├── https://deno.land/std@0.53.0/encoding/utf8.ts│ │ │ │ ├─┬ https://deno.land/std@0.53.0/io/bufio.ts│ │ │ │ │ ├─┬ https://deno.land/std@0.53.0/io/util.ts--snip--Deno对代码的“版本”没有意见 。 URL就是URL 。 虽然Deno需要适当的媒体类型以了解如何处理代码 , 但有关代码本身如何提供的“意见”都交给Web服务器处理 。 服务器可以对核心内容采取语义版本控制 , 或者可以将URL映射到任何资源上 。 Deno不关心这些 。 例如 , https://deno.land/x/实际上只是一个URL重定向服务器 , 它在URL重定向服务器中重写URL , 重定向到一个git commit风格的地址 。 所以https://deno.land/x/oak@v4.0.0/mod.ts变成https://raw.githubusercontent.com/oakserver/oak/v4.0.0/mod.ts , 这个URL是GitHub上带有版本的模块 。当然 , 将“版本化”的远程URL分散在整个代码中并不合适 , 所以不要这样做 。 把依赖关系当做代码的优势在于 , 您可以按照自己想要的任何方式来构造它们 。 常见的约定是使用deps.ts , 它将重新导出您可能需要的所有依赖项 。 看一看oak服务器的例子:
推荐阅读
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- CSDN|软件对于英特尔意味着什么?
- CSDN|中国首家苹果零售店重开业,苹果CEO库克发文揭幕;“携号转网”服务用户破千万;GitHub 完成北极源代码存档|极客头条
- 智能机器人|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”
- CSDN|万亿美元软件浪潮来临,开发者是核心!
- 行业互联网|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”
- CSDN|OpenInfra Days China 2020 官网正式上线,含免费注册通道!
- 电脑使用技巧|Win10 20H2面向Beta会员推送:修复大量BUG、完工在即
- CSDN|实战 | 对抗外部威胁防护和勒索病毒,大厂怎么做?
- CSDN|它估值 25 亿!被马云领投,是华为“老战友”,网友:也许股价能超茅台!
