学得动的Deno

4,258 阅读4分钟

学得动的Deno

原创: 崔天泽 黑马大前端

Deno是一种新型的构建在Google V8引擎之上的TypeScript安全运行时,最近已经发布到了0.1.8版本。

这个运行时是为了解决NodeJS带来的一系列问题:

不再有package.json,不再有经常变化的依赖;

取而代之的是,保存文件到你的项目中,或者通过http资源下载他们,之后他们便可以永久地被缓存下来;

同时,不再采用GYP(Generate Your Projects,是一个Google开源的构建系统,最开始用于Chromium项目,下载一些其他的开源项目也开始使用GYP,如V8、Node.js、WebRTC等),替代他的是GN(GN是一个生成Ninja构建文件的元构建系统,以便可以用Ninja构建Chromium,GN文件比GYP文件更具可读性和可维护性,GN比GYP快20倍);

通过flatbuffers(FlatBuffers是一个开源的、跨平台的、高效的、提供了C++/Java接口的序列化工具库)消息传递取代直接调用系统方法;

此外还带有开箱即用的TypeScript语法支持,不再需要Babel之类的工具将TypeScript编译成JavaScript。


本文不会告诉你Deno究竟有多强大,仅是一篇快速入门的教程让你了解这个新运行时,作者后续也会关注Deno的发展动向,如果有新收获也会同步给大家。


安装

二进制文件可以从Deno的GitHub仓库获取,你可以阅读仓库的Readme文件,自己尝试去编译它。编译的过程十分占系统资源,因此确保你的机器RAM至少在4GB以上,并且是SSD硬盘,否则你将花费大量的时间等待编译的完成。


我们就通过Python的方式下载安装deno吧,毕竟mac上默认安装有Python。

curl -sSf https://raw.githubusercontent.com/denoland/deno_install/master/install.py | python

然后将Deno将入到环境变量中

echo export PATH="/Users/cuitianze/.deno/bin":\$PATH >> $HOME/.bash_profile

OK,大功告成!


运行脚本

在Deno中,你既可以运行JavaScript文件,也可以运行TypeScript文件。通过Deno命令将文件名作为参数运行你的代码。你可以在仓库的tests文件夹中看到大量的Deno脚本示例。


控制台输出

和其他任何语言或者框架一样,你可以做的第一件事就是在控制台里输出一个消息。你可以简单地写如下代码打印出“Hello World!”。

console.log("Hello World!")


文件系统访问

Deno提供了基础的文件系统同步访问的能力,如readFileSync和writeFileSync函数。

readFileSync以文件的路径作为参数(可以是相对于当前工作目录的相对路径,也可以是绝对路径),调用后会返回文件内容。

首先创建一个包含“黑马大前端”字符串的文件,

echo 黑马大前端 >> hi.txt

然后通过以下的代码来读取这个文件,创建hi.ts:

import { readFileSync } from "deno";

const data = readFileSync("hi.txt");

console.log(data);

我们看看会打印出什么?

我们通过readFileSync打印出了无符号8位整型数组形式的数据。如果我们想将它转换成字符串形式,需要使用“TextDecoder”,以下代码会生成正确的输出:

import { readFileSync } from "deno";
const decoder = new TextDecoder("utf-8");
const data = readFileSync("hello.txt");
console.log(decoder.decode(data));

Perfect!“黑马大前端”被成功地打印出来了。


文件写入

既然我们已经读取并且解码了一个文本文件,那么接下来我们要演示的就是写入一个文件。我们通过writeFileSync函数来实现。这个函数需要传递两个参数,一个是文件路径,一个是待写入的内容。我们创建hello.ts写入如下代码:

import { writeFileSync } from "deno";
const encoder = new TextEncoder("utf-8");
const data = encoder.encode("你好,黑马大前端");
writeFileSync("hello.txt", data);

然而,事与愿违,文件写入并不像文件读取那样轻松。

这是因为Deno默认禁止写的权限,需要特别授权文件写的权限以让writeFileSync生效。

deno --allow-write hello.ts

Cool!成功写入文件了。

但是我们怎么可能仅仅满足于这样的“一刀切”方式的文件权限控制。

我们在实际项目中,应该是对第三方引入的文件存在不信任,此时应该有更细粒度的文件访问和网络访问的权限控制,我也向Deno的核心成员提出了我的疑虑,值得庆幸的是,更细粒度的权限控制已经在规划中了。


文件信息读取

statSync函数会返回一个文件的信息。

import { statSync } from "deno";
const fileInfo = deno.statSync("hi.txt");
console.log(fileInfo.isFile());
console.log(fileInfo.isSymlink());
console.log(fileInfo.isDirectory());
console.log(fileInfo.len); // File Size
console.log(fileInfo.modified); // Last modification date
console.log(fileInfo.accessed); // Last access date
console.log(fileInfo.created); // Creation date

得到的文件信息如下:


定时器

定时器支持setTimeout, clearTimeout, setInterval和clearInterval,

正如JavaScript的用法一样,这里就不详细概述了。

setTimeout(function() {
    console.log("---黑马来了---");}, 
3000);

自己跑一遍就有感知了,运行结果如下:


还有一个Feature不得不提,deno可以直接运行网络文件。


赞👍期待Deno发展得越来越好。


本文作者:黑马大前端 崔天泽

微信扫一扫
关注“黑马大前端”公众号