程序运行依赖的重要文件版本不对_Deno核心模块:灵活依赖amp;安全沙箱
?? ??? ?Deno 的目標不是兼容 Node,而是兼容瀏覽器。Deno 不是要取代 Node.js,也不是下一代 Node.js,也不是要放棄 npm 重建 Node 生態。比如react和vue的存在,兩個框架都很好,并不是誰要消滅誰,我們可以哪個合適用哪個,想用哪個用哪個。deno 的目前是要擁抱瀏覽器生態。
?? ??? ?前期文章講解過《初識Deno》(https://mp.weixin.qq.com/s/ZlnbBITXDqxpwLf32n9-bw)和《從模塊談Deno和Node的區別(https://mp.weixin.qq.com/s/LshySTHs7rlMsBcmx6qVuw)?。本期內容主要圍繞Deno核心模塊中比較重要的兩個部分講解:安全沙箱機制和Deno依賴引入管理。
?? ?? ?標題提到過核心模塊,講解一下我個人對于Deno模塊的理解,我的劃分:第三方庫、標準庫、底層運行時、安全沙箱機制和依賴管理。順帶我們可以看看Deno源碼項目目錄的劃分(本次所針對的都是version1.5.3的版本),主要包含以下部分:
一、靈活依賴??????? Deno天然支持ECMAScript 6(以下簡稱es6),可以直接用es6 的模塊引入方式(即import/export,后面簡稱es module)。Deno 依靠 es module 引入URL 來承載和導入程序包。這種引入插件的方式非常靈活,我們可以直接創建軟件包而無需在 NPM 這樣的存儲庫中發布它們。
?? ?? ? 下面我們通過官方簡單demo來展現Deno通過es module 引入URL請求資源并且執行,當我們運行代碼`?deno run https://deno.land/std/examples/welcome.ts?`,會正確返回如下圖的結果。
? ???? ???下圖是官方demo中的代碼:
? ??? ? 可以看到上面項目我們本地沒有任何代碼或者項目,只是運行了一個遠程的官方demo文件,在控制臺就直接執行并且正確執行結果。不需要自己去下載要引入的代碼,‘拿來主義’直接執行就好了,非常省事。
?? ??? ?默認情況下,緩存中的模塊將被重用,而無需獲取或重新編譯它。那是否存在緩存不被更新依賴到舊代碼的問題?肯定會的。有時候我們并不希望使用緩存的模塊,我們可以強制 deno 重新下載模塊并重新編譯到緩存中。可以使用 deno cache 子命令的--reload 選項來使本地緩存無效。
?? ?? ? 帶著問題學習可能會更易于理解,我們來看看下一個問題。由于Deno直接引入外部代碼或者本地代碼,沒有包管理器的情況下管理外部依賴關系就會導致問題。會不會在用的地方引入會導致引入文件比較雜亂、項目越大越難維護、重復引入等問題?答案是肯定的。
?? ??? ?在 Deno 中解決這些問題的標準做法是創建一個 deps.ts 文件。此文件中引用了所有必需的遠程依賴關系,并且重新導出了所需的方法和類。本地模塊從 deps.ts 導入所需方法和類,而不是遠程依賴。這樣就可以輕松跨大型代碼庫更新模塊,并解決“程序包管理器問題”。開發依賴項也可以在單獨的 dev_deps.ts 文件中進行管理。
??????? deps.ts中引入文件示例圖:
depsTest.ts中引入文件示例圖:??????? depsTest.ts 運行示例圖:
????????可以看到上面可以正確運行出結果,感覺是未來的趨勢,精簡而干練。
????????那么Deno為何可以通過URL直接引入其他資源直接執行呢?deno有自己的緩存遠端資源的邏輯。下面我們來看看deno/core代碼模塊的https_catsh.rs部分源碼。
?? ?? ? 即使作為前端人員不是很懂rust,從下面源碼大致可以get到兩個方法:base_url_tofilename和url_to_filename。base_url_tofilename將請求的url解析后返回成`主域名+文件hash`的字符串返回,url_to_filename直接調用的base_url_tofilename,返回一個包含緩存文件名的數組,并且該模塊代碼會進行文件內容的寫入等一些列操作。get_cache_filename是總出口文件,供core/http_fetcher.rs文件模塊使用。
?
????????下圖是經過base_url_tofilename方法處理后的前后文件名的對應關系。
????????文件模塊core/http_fetcher.rs,可以起一個http服務,查詢文件是否在本地存在。如果文件存在,就直接從本地拿文件資源,如果本地緩存中沒有文件,就通過http請求與遠端建立鏈接,獲取遠端資源寫入到本地進行緩存。
?? ??? ?下面代碼則是緩存處理的初始化配置信息。默認是從緩存中獲取數據,不需要中心加載所有數據,以及只有使用權限。
一 、安全沙箱機制
?? ?? ? URL的方式直接引入文件會不會導致和node一樣的權限紊亂問題?Deno的答案是“NO”。Deno有自己的安全沙箱機制。
?? ?? ?首先對沙箱進行簡單的釋義。沙箱是一個限制程序運行的環境,通過這樣的措施來保證對代碼的有效隔離,防止對本地系統造成破壞。
?? ??? ?Deno 的安全沙箱機制來自 web。安全沙箱機制是 web 的特色,瀏覽器中運行的 js 代碼可能來自任何地方,而且都不是我們主動下載運行的,也不一定這些代碼都是受信任的,但是我們依然敢運行這些代碼。是因為瀏覽器的沙箱機制保證了這些 js 代碼不會訪問系統資源。
?? ?? ? Deno的安全沙箱機制主要包含文件讀取權限、網絡權限、系統權限。默認我們代碼是沒有訪問這些權限的,在命令行參數中為 Deno 進程授權后才能訪問安全敏感的功能。在實際開發過程中我們可以加上--allow-all (允許所有權限,無安全限制)、-allow-env (允許環境訪問,比如讀取和設置環境變量)、--allow-net= (允許網絡訪問)、--allow-write=(允許寫入文件系統)或?--allow-read=(允許讀取文件系統)等權限,賦予我們的代碼一定的權限。
?? ??? ?如下代碼為rust中判斷是否有創建文件夾權限,有權限才可循環創建文件夾,否則提示沒權限。
? ? ?
????????如下圖,permission.rs文件中會對各項權限進行判斷。判斷有沒有寫入權限,有沒有網絡權限等。
????????在deno使用過程中我一直有個疑惑:為什么deno run 'https://deno***'下的文件沒提示需要網路權限,在查看源碼發現是deno內部處理了對deno網絡權限權限的白名單,如下圖所示:
????????最后,作為文章的收尾,提一下作為deno rust語言入口文件的main.ts,通過main方法把所有代碼模塊串聯起來,運行出我們所看到的deno效果。主入口方法如下圖所示。
?? ??? ?由于對rust語言以及deno的原理熟悉度有限,本編文章主要講解到這里。如果文章中有不合適的地方或者講解的不對的,歡迎留言交流。一起學習Deno,fighting~~?
總結
以上是生活随笔為你收集整理的程序运行依赖的重要文件版本不对_Deno核心模块:灵活依赖amp;安全沙箱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编写格斗游戏_C语言实现的开
- 下一篇: python制作题库网站_Python解