
盡管方法不是很好,但有時别無選擇。
Deno 是基于 Web 技術的伺服器端代碼執行環境。Node 使用 JavaScript 與 commonjs 子產品,并把 npm/yarn 作為其包管理器。
Deno 使用 Typescript 或 JavaScript, 以及現代的 javascript 導入語句。它不需要包管理器。
想要導入 deno 中的子產品,應該通過 URL 引用:import { serve } from "https://deno.land/std/http/server.ts";
你可以在 Deno 标準庫 或 Deno 第三方子產品清單中找到更多需要的子產品,但是它們并不能滿足你所需要的一切。有時隻能使用依賴 npm 生态所提供的子產品。下面是從最友善到最繁瑣的一些方法:
1. 如果子產品使用了 ES 子產品的 import/export 文法。
你在 deno 中所使用的庫不一定要來自推薦的 Deno 包,它們可以來自任何 URL,隻要它們用了 import 文法即可。通過 unpkg 直接從 npm 存儲庫内部通路這些檔案不失為一個好方法。import throttle from https://unpkg.com/[email protected]/throttle.js
2. 如果子產品本身沒有使用 imports,但源代碼用到了
如果是通過 npm 編譯的子產品,或使用了錯誤格式的子產品,那麼是否使用其源代碼可能需要一些運氣。許多流行庫的源代碼已經從 commonjs 遷移到了符合标準的 ES 子產品的 import 文法。
一些軟體包有單獨的 src/ 和 dist/ 目錄,其中 ES 子產品風格的代碼位于 src/ 中,但 npm 中并未将其包含在軟體包中。在這種情況下,你可以直接從源進行導入。import throttle from "https://raw.githubusercontent.com/lodash/lodash/master/throttle.js";
可以通過單擊 github 上的 “raw” 按鈕得到這個 URL,進而擷取原始的 JS 檔案。使用 github cdn 或檢視檔案是否可以通過 github 頁面進行通路,這樣更直接,但卻是可行的。
特别注意: 一些庫将 ES 子產品與 webpack 一起使用,或者使用子產品加載器,使它們可以從 Node 子產品中導入,如下所示://不好的用法:
import { someFunction } from "modulename";
import { someOtherFunction } from "modulename/file.js";
标準的導入方法是,要以 ./ 開頭或者是一個可以正常工作的 URL://标準的用法:
import { someOtherFunction } from "./folder/file.js";
不過你也可以嘗試下一種方法:
3. 導入 commonjs 子產品
幸運的是,有一個名為 JSPM 的服務,它能夠解析第三方子產品并對 commonjs 子產品進行編譯來用作 ES 子產品導入。該工具可用于在浏覽器中使用 Node 子產品,而無需建構步驟。但是我們也可以在這裡用到它。
在我最近的項目中,想進行推送通知,其中涉及生成 VAPID 的憑據,有一個可以加密的 deno 密碼庫,但是整個開發過程很困難,我甯願使用流行的 web-push 庫。可以用 JSPM CDN 和如下 URL 進行導入:import webPush from "https://dev.jspm.io/web-push";
這樣可以在 deno 中向像使用其他任何子產品一樣去使用它。
使 Typescript 類型能夠正常工作
在 deno 中使用 typecipt 有一個不錯的功能,就是很容易能夠為子產品提供了非常完美的自動補全功能。如果編輯器的 deno 擴充知道類型定義,它甚至可以自動補全第三方子產品。
盡管這對代碼是否能夠正常工作不是必要的,但是可以幫你很好的維護代碼。
在我導入另一個名為 fast-xml-parser 的子產品時,我注意到它有一個類型定義檔案是以 .d.ts 結尾的。這些檔案描述了各種接口,甚至适用于 JavaScript.js 檔案。有時你還可以在 @types\somemodule 存儲庫中找到類型定義檔案。
通過這個檔案 typescript 可以自動完成從 JavaScript 檔案導入的内容。即使對于用 JSPM 導入的檔案也是如此:// 導入 fast-xml-parser 庫
import fastXMLParser from "https://dev.jspm.io/fast-xml-parser";
// 從 fast-xml-parser 的源代碼導入類型定義檔案
import * as FastXMLParser from "https://raw.githubusercontent.com/NaturalIntelligence/fast-xml-parser/master/src/parser.d.ts";
//将 parser 與以下類型一起使用
const parser = fastXMLParser as typeof FastXMLParser;
我從定義檔案中将類型定義導入為 FastXMLParser(請注意是大寫的 F),它不包含任何有效代碼,但這是一個與我們要導入的代碼具有相同類型的對象。
我從 JSPM 中将代碼導入為 fastXMLParser(小寫字母 f),這是有效的代碼,但沒有類型。
接下來,把它們組合在一起來建立 parser,即 FastXMLParser 類型的 fastXMLParser 。
最後希望你能嘗試一下deno。Deno 能夠使用任何一種用于 Web 甚至是用于 node/npm 的子產品,确實為這個新的伺服器端庫生态奠定了良好的基礎。本文轉載自:https://segmentfault.com/a/1190000023824702
想要了解更多相關知識,可通路 前端學習網站!!