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;安全沙箱相关推荐

  1. python中把输出结果写到一个文件中_Python3.6笔记之将程序运行结果输出到文件的方法...

    Python3.6笔记之将程序运行结果输出到文件的方法 更新时间:2018年04月22日 14:27:32 投稿:jingxian 下面小编就为大家分享一篇Python3.6笔记之将程序运行结果输出到 ...

  2. 编译Ngnix遇到的问题,查看程序依赖的库文件

    要点:ldd 可以读取每个可以运行的程序依赖的 so 文件. 编译的时候提示需要Openssl库. 查看本机,已经安装了openssl 查看编译报错文件,查找Openssl所依赖的库 more obj ...

  3. IOS学习笔记1—Iphone程序运行流程

    Iphone程序运行流程 main.m文件,iOS应用程序的主入口 main函数的两个参数为命令行参数,在ios开发中不会用到这些元素,包括这两个参数是为了与标准ANSI C保持一致 UIApplic ...

  4. 游戏与计算机系统不兼容,电脑安装游戏时提示此文件版本与正在运行Windows不兼容的解决方法...

    在电脑系统安装游戏的过程中遇到一些问题,导致无法正常安装游戏程序.在安装过程中,出现提示"此文件版本与正在运行Windows不兼容",对于这样的问题,我们应该如何进行解决呢?下面驱 ...

  5. Ubuntu 16.04 火狐添加java插件、解决Firefox强制低版本java插件运行以及安全设置限制自签名应用程序运行

    1.火狐添加java 插件 我的jdk是1.7版本在/home/lzhprogram/java目录 火狐插件文件夹在/usr/user/mozija/plugins 使用如下软链接即可给火狐添加插件 ...

  6. gl linux qt 库_Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

    最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...

  7. CTP 4097错误根源 / CTP程序运行没有反应/CTP版本说明

    其实这本是个很简单的错误,但经常看到有人问到,而且网上居然还出了玄学解答,所以干脆单独写一篇解释一下这个错误. 这一篇文章同样适用于解决为什么没有OnFrontConnected回调,Decrypt ...

  8. win10系统.android是什么文件夹,d盘文件不见了怎么恢复?Windows10增加安卓程序运行...

    原标题:d盘文件不见了怎么恢复?Windows10增加安卓程序运行 d盘文件不见了怎么恢复?windows电脑我们很多人都在用,但是大家知道D盘文件删除了怎么恢复吗?其实很多人不知道,先给大家介绍一下 ...

  9. Sandboxie-沙箱软件-Plus版本(Qt)-主框架程序-SandMan.exe-创建语言文件-tr-Qt-语言国际化

    文章目录 1.功能介绍 2.Qt语言国际化 3.设置软件的语言版本 4.作者答疑 1.功能介绍 沙箱软件的增强版本采用Qt架构开发,核心模块与经典版本相同,本文主要介绍SandMan.exe这个主程序 ...

最新文章

  1. oracle中 怎么替换,oracle如何替换字符串?
  2. 智源研究院发布世界首个“机器学习通用数学符号集”
  3. 每个程序员都应该读的书
  4. 配置免密码登录Linux服务器
  5. MapGuide应用开发系列(四)---- 如何运行第一个.net实例代码
  6. 央行放水点燃房价,普通家庭如何理财?
  7. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1109:开关灯
  8. c语言链表编程作业,C语言编程入门——链表
  9. 字符函数、字符串函数、内存函数用法及其模拟实现
  10. 为什么到最后还是要 专注于博客写作
  11. Delphi中的异常处理
  12. 推荐一份完整的python教学视频
  13. java 按拼音模糊搜索汉字_数据查询支持中文拼音首字母模糊检索
  14. libpng的使用 | 在Linux系统下编译、安装与使用
  15. MIPS32-单周期数据通路设计
  16. Idea新建项目和快捷键
  17. html如何链接icon,iconfont在线链接使用
  18. 小学生春天计算机绘画图片,小学生绘画作品图片春天
  19. HTML学生个人网站作业设计:旅游景点网站设计——北京故宫(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  20. X站全称是什么_考不上高中上什么专业

热门文章

  1. quilleditor 字体大小设置_vue-quill-editor如何设置字体默认大小?
  2. java 压缩汉字字节_java中计算汉字的字节数
  3. c语言malloc面试题,c语言面试最必考的十道试题,求职必看!!!
  4. android 判断http编码格式,安卓入门笔记之HttpURLConnection的使用
  5. Docker入门-搭建docker私有仓库
  6. Token 认证的来龙去脉,DRF认证,DRF权限,DRF限制
  7. java程序发布成exe等
  8. 你们肯定都不相信每天能准时下班了
  9. Visual Stdio的解决方案资源管理器位置调整
  10. drupal6 笔记