Skip to content

Latest commit

 

History

History
80 lines (51 loc) · 4.33 KB

deno_mod.md

File metadata and controls

80 lines (51 loc) · 4.33 KB

Deno模块体系

前言

DenoTypeScript 作为开发语法,模块就是以标准的ES6import/export规范使用。摆脱了Node.js目前(v11.x)主流支持的CommonJS规范。在Deno使用中,虽然是把开发者的TypeScript源码编译成JavaScript,但是从语言使用层面直接做了编译能力,开发者只需要关心TypeScript语法的开发所需要的功能,不需要花太多精力关注怎么把TypeScript编译成JavaScript

模块规范

术语称谓

Use the term "module" instead of "library" or "package" For clarity and consistency avoid the terms "library" and "package". Instead use "module" to refer to a single JS or TS file and also to refer to a directory of TS/JS code.

根据官方标准模块风格的介绍 https://github.com/denoland/deno_stdDeno的模块建议使用名称术语 module,而不是 librarypackage

模块风格规范

参考: deno 官方模块风格指南 https://deno.land/manual/contributing/style_guide

  • 使用名词术语 module 而不是 libpackage
  • 如果需要一个入口文件,则建议使用mod.ts而不是index.jsindex.ts
  • 文件命名方式使用“下划线”_,例如file_sys.ts,不要使用“破折号”-
  • 输出方最多是两个参数,如果参数太多,超出部分用对象的方式代替
  • 使用标准代码格式化命令去检查代码格式deno --fmt

模块分类

1.原生模块

Deno 原生基础能力的模块,直接从Deno中引用,例如

const { readFileSync, writeFileSync } = Deno

原生模块主要提供以下能力。

  • 原生基础能力的类,例如: 文件操作模块 readFileSyncwriteFileSync,网络操作的模块 listen 等。
  • 原生基础能力的接口interface,例如:读写接口ReaderWriterCloser,或者网络接口Conn等。

2.本地模块

就是本地开发时候,自己定义的 TypeScript 模块文件,直接用 import 从本地相对或者绝对路径引用,例如:

import { Module1, Module2 } from "./mod/xxx.ts";

3.标准模块

Deno官方有个目标是 Aims to be browser compatible.,也就代表着模块也可以像浏览器一下,用js链接使用模块。例如:

import { assertEquals } from "https://deno.land/std@v0.59.0/testing/asserts.ts";

同时Deno团队为了规范远程模块的使用,特地建立了deno_std作为官方远程模块的标准模块,存放在deno仓库下 https://github.com/denoland/deno/tree/master/std。官方的说明如下:

These modules do not have external dependencies and they are reviewed by the Deno core team. The intention is to have a standard set of high quality code that all Deno projects can use fearlessly. Contributions are welcome!

从官方了解到的信息可以总结如下

  • 标准模块要按照推荐代码格式去规范
  • 标准模块以 https://deno.land/std/ 为URL开头
  • 标准模块可以用无版本带版本号 URL链接使用
  • 任何第三方都可以贡献代码,申请使用 https://deno.land/std/ 成为标准模块,这个有点像Java的maven 官方管理。

其他远程模块

除了以上三种模块类型,最后一种模块类型,就是自行搭建远程HTTP服务,自己定义自己的远程模块,类似Node.js可以定义自己的私有或者共有npm源。

模块编译

Deno 官方提到Deno是一个 TypeScript运行环境,并不是直接的runtime,而是在Deno使用中,把开发者的TypeScript源码编译成JavaScript,然后调用V8去执行代码 。

因此,这里就有一个编译TypeScript的过程。Deno将开发者本地TypeScript源码、源码中URL引用的远程代码,一并下载并且编译到本地系统中,并且用hash命名编译后的js文件和sourceMap文件。

编译位置

在deno的安装目录\.deno下,有两个文件夹

  • \.deno\deps\* 存放远程模块下载在本地和golang类似。
  • \.deno\gen\* 存放本地TypeScript编译后的hash命名js文件和对应sourceMap文件。