网易首页 > 网易号 > 正文 申请入驻

Deno: 你并不总是需要NodeJS

0
分享至

作者:binxiong,CSIG云产一研发工作室Tech Lead

回顾Node包管理复杂

Node包管理很复杂, 包之间又有可能互相依赖, 互相引用. 且存在多个版本安装混乱的问题.

这时候就又需要借助yarn.lock之类的工具进行管理. 并且根据yarn官方文档说明, yarn会忽略依赖包内的yarn.lock, 仅支持top-level的yarn.lock . 所以可能会导致你的node_modules里面充斥着各种版本, 各种重复的包.

权限风险

由于引用的包都已经安装至node_modules, 并且node运行时无法进行任何的权限控制. 导致有可能第三方包在运行的时候, 会有隐私风险. 比如你只是想读取本地的文件, 可是它一边扫描你运行的文件, 一边通过网络请求将你本地的数据抓取上传, 或者修改删除.

require需要处理多种情况

在 Y 目录下 require(X) 时:

  1. 如果 X 是内置模块,加载该模块;
  2. 如果 X 以 / 开头,设置 Y 为文件系统的根部 (root);
  3. 当 X 以 ./ , / , ../ 开头时,加载该文件或者加载该目录;
  4. 否则加载 node_modules 目录下的模块: LOAD_NODE_MODULES(X, dirname(Y))

用一幅图来开涮一下node_modules

处理逻辑采用回调函数const fs = require('fs');fs.readFile('README.md', (err, data) => { if (err) { // error handling } else { // data handling }});总结

  • 不修改npm源的情况下, 为中心化组件库
  • 使用回调进行逻辑处理
  • 无法控制第三方库进行的读取, 网络权限
  • require处理复杂
  • 无法直接运行typescript
  • Version>13.2.0后, 支持ES modules, 之前使用CommonJS
背景介绍

Deno是一个可以运行JavaScript, Typescript的执行环境. 前者能力由V8引擎提供, 后者由Rust语言创造.

因为Rust支持WebAssembly, 所以可以直接使用wasm库和代码

Deno架构

  1. Deno使用Rust启动
  2. 因为V8由C++编写, 所以通过Rust去执行C++代码来初始化V8对象. 这一部分使用Rust FFI调用rusty_v8执行
  3. 这样Deno就可以执行JavaScript代码了
  4. 运行ts的时候, 会通过内置的tsc和swc进行预编译, 并且提供一份缓存.
  5. Tokio提供事件处理
Deno的包管理

提供三种方式引入资源文件

// 从 URL 导入import XXXX from "https://cdn.bootcdn.net/abc.js";// 从相对路径导入import * as Service from "./service.js";// 从绝对路径导入import X from "/index.js";

在Node当中的一些引用语法, 在Deno当中并不得到支持

// 模块类的引入方法import x from "x";// 不标明根目录的路径~~import x from "x/index.js";~~ // 通过[import maps](https://deno.land/manual/linking_to_external_code/import_maps)可以解决这样的引用~~~~// 没有标明文件后缀import index from "./index";// import maps来解决相对路径引用问题{ "imports": { "fmt/": "https://deno.land/std@0.141.0/fmt/" }}import { red } from "fmt/colors.ts";console.log(red("hello world"));deno run --import-map=import_map.json color.tsDeno的权限控制

  • -allow-env= 允许环境访问,例如读取和设置环境变量。
  • -allow-hrtime 允许高精度时间,高精度时间能够在计时攻击和特征识别中使用。
  • -allow-net= 允许网络访问。您可以指定一系列用逗号分隔的域名,来提供域名白名单。
  • -allow-ffi 允许加载动态的依赖, 注意, 也不在沙箱中运行. 谨慎使用, 并且该API并不稳定.
  • -allow-read= 允许读取文件系统。您可以指定一系列用逗号分隔的目录或文件,来提供文件系统白名单。
  • -allow-run= 允许运行子进程。请注意,子进程不在沙箱中运行,因此没有与 deno 进程相同的安全限制,请谨慎使用。
  • -allow-write= 允许写入文件系统。您可以指定一系列用逗号分隔的目录或文件,来提供文件系统白名单。
  • A, --allow-all 允许所有权限,这将禁用所有安全限制
Deno支持Promise进行逻辑处理// read-file.ts - Denotry { const data = await Deno.readFile('README.md'); // Handle the data} catch (e) { // Handle the error}

从上述代码可以看到. Deno支持 top-level await, 意味着你可以不依赖async function直接使用await语法.

内置命令

  • bundle Bundle module and dependencies into single file
  • cache Cache the dependencies
  • compile UNSTABLE: Compile the script into a self contained executable
  • completions Generate shell completions
  • coverage Print coverage reports
  • doc Show documentation for a module
  • eval Eval script
  • fmt Format source files
  • help Prints this message or the help of the given subcommand(s)
  • info Show info about cache or info related to source file
  • install Install script as an executable
  • lint Lint source files
  • lsp Start the language server
  • repl Read Eval Print Loop
  • run Run a JavaScript or TypeScript program
  • test Run tests
  • types Print runtime TypeScript declarations
  • uninstall Uninstall a script previously installed with deno install
  • upgrade Upgrade deno executable to given version
总结
  • 不断扩充的组件库
  • 原生支持promise进行逻辑处理
  • 原生支持typescript
  • 原生支持ES modules
  • 允许进行文件系统, 网络访问等权限控制, 用来执行沙盒代码
  • 可编译为一个可执行文件
  • 兼容浏览器API, 比如支持window对象
与我们的业务结合import { emptyDir, emptyDirSync, ensureDirSync, ensureFileSync,} from "https://deno.land/std@0.132.0/fs/mod.ts";if(!Deno?.args?.[0]) { console.error("请输入TED文件目录"); Deno.exit(1);}const tedPath = Deno.args[0]for await(const f of Deno.readDir(tedPath)) { if(f.isFile) continue; if(f.name.includes("a-b-c")) { for await(const y of Deno.readDir(`${tedPath}/${f.name}`)) { if(y.isFile) continue; if(y.name.includes("c-d")){ ensureFileSync(`${tedPath}/${f.name}/${y.name}/TCE/sync.sh`); const text = await Deno.readTextFile("./sync.sh"); const s = await Deno.writeTextFile(`${tedPath}/${f.name}/${y.name}/TCE/sync.sh`, text); } } }}

deno run --allow-read --allow-write test.ts /path

我们使用了typescript脚本, 进行了ted项目的批量修改.

一些疑问

组件库支持情况?

支持主流库, 如lodash, i18next, billboardjs等, 官方也提供了安装地址, https://deno.land/x

如果贡献, 使用第三方库?

自行开发第三方组件很简单, 只需要上传到托管js的服务器, 或者直接放在github即可. 也可以在官方发布组件.

能否使用node_modues?

不能直接使用node_modules, 但是有一些组件库做了层级适配, 可以间接使用

既然都在使用远程依赖的文件, 如果文件被篡改怎么办? 是否安全?

官方给的解决方案是, 使用cache的lock功能, 将文件锁定deno cache --lock=lock.json --lock-write src/deps.ts

实现一个简单HTTP web server// handler.tsexport function handler(req: Request): Response { return new Response("Hello, World!");}// entry.tsimport { handler } from './handler.ts';import { serve } from "https://deno.land/std@0.141.0/http/server.ts";serve(handler, { port: 4242 });

deno run --allow-net ./entry.ts

Web框架介绍

在deno中也有对应的web框架, 叫做oak. 使用方法基本上和KOA是一致的, 官网文档也说明了, 是受到KOA启发而做的.

import { Application } from "https://deno.land/x/oak/mod.ts";const app = new Application();// Loggerapp.use(async (ctx, next) => { await next(); const rt = ctx.response.headers.get("X-Response-Time"); console.log(`${ctx.request.method} ${ctx.request.url} - ${rt}`);});// Timingapp.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = Date.now() - start; ctx.response.headers.set("X-Response-Time", `${ms}ms`);});// Hello World!app.use((ctx) => { ctx.response.body = "Hello World!";});await app.listen({ port: 8000 });进行react渲染

Deno默认支持jsx, tsx的语法, 使用它就可以创建一个基于Deno的react app了.

它采用了和npm方式完全不同的模块管理.

可以从它的模板依赖代码看到, 它完全采用的是远程的代码.

import { serve } from "https://deno.land/std@0.140.0/http/server.ts";import { h, ssr, tw } from "https://crux.land/nanossr@0.0.1";const Hello = (props) => (

Hello {props.name}!

);await serve((req) => { const url = new URL(req.url); const name = url.searchParams.get("name") ?? "world"; return ssr(() => );});总结

受限文章长度, deno的事件处理, 在rust当中也可以作为独立的应用使用, 以及如何和wasm结合使用都没有展开来说.

简单来说, deno是一个轻量, 自由的库. 我总结的适用场景可以是, 1. 脚本文件, 2. 做一个 data mock server, 3. 前端的监控或者是自动化测试脚本编写工具.

当然作为一个还在不断发展的库, deno还有更多的可能性, 我这里只是总结了几种场景.

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
嘴里抠出来的黄色石头为啥又臭又硬?这臭石头咋来的?

嘴里抠出来的黄色石头为啥又臭又硬?这臭石头咋来的?

向航说
2026-02-17 00:40:03
“长安”这个名字不好吗,为什么要改为“西安”,谁改的?

“长安”这个名字不好吗,为什么要改为“西安”,谁改的?

长风文史
2026-01-20 20:02:02
全面取消!中国反制手段升级!高市慌了,踩红线让日本已无力承受

全面取消!中国反制手段升级!高市慌了,踩红线让日本已无力承受

趣生活
2026-02-17 16:43:20
一颗“草”毁掉一个国家,让也门陷入瘫痪的恰特草,到底是什么?

一颗“草”毁掉一个国家,让也门陷入瘫痪的恰特草,到底是什么?

半解智士
2026-02-05 17:51:22
阿尔茨海默病者逐渐增多,医生提醒:55岁后,尽量改掉6个坏习惯

阿尔茨海默病者逐渐增多,医生提醒:55岁后,尽量改掉6个坏习惯

39健康网
2026-02-17 18:31:37
一块布卡住英伟达的脖子!日企垄断30年后,中国造出王炸撕碎封锁

一块布卡住英伟达的脖子!日企垄断30年后,中国造出王炸撕碎封锁

胖哥不胡说
2026-01-20 11:10:05
原来骆驼还能这么可怕的,看了网友的分享,又学到一个保命知识

原来骆驼还能这么可怕的,看了网友的分享,又学到一个保命知识

墙头草
2026-02-11 08:30:15
公公悄悄给我800万,叮嘱我不能够告诉老公,3年后才知他的用意

公公悄悄给我800万,叮嘱我不能够告诉老公,3年后才知他的用意

千秋文化
2025-12-22 21:55:10
以为是假新闻其实是真新闻,从袁立到王星,件件离谱又惊人

以为是假新闻其实是真新闻,从袁立到王星,件件离谱又惊人

上官晚安
2026-01-06 08:08:35
黄一鸣回应公开孩子父亲身份:你不给抚养费,我就用你的流量赚钱

黄一鸣回应公开孩子父亲身份:你不给抚养费,我就用你的流量赚钱

动物奇奇怪怪
2026-02-17 21:48:48
官媒亲宣,33岁韦东奕再破天花板,让王虹和整个学术圈“沉默”了

官媒亲宣,33岁韦东奕再破天花板,让王虹和整个学术圈“沉默”了

趣文说娱
2026-01-24 15:17:05
豆包,这是要砸了所有人的饭碗

豆包,这是要砸了所有人的饭碗

牛顿顿顿
2025-12-07 19:23:58
LOL官方发文成电竞圈焦点,一个ID被反复刷屏,LPL真不能少了他?

LOL官方发文成电竞圈焦点,一个ID被反复刷屏,LPL真不能少了他?

暴龙电竞号
2026-02-18 23:53:35
爽文!过年被欺负要不要忍?网友:直接掀桌子,战绩可查!

爽文!过年被欺负要不要忍?网友:直接掀桌子,战绩可查!

夜深爱杂谈
2026-02-18 21:00:31
少拿1.1亿美元,如今索要超级顶薪!作为球队老大,你可能被算计

少拿1.1亿美元,如今索要超级顶薪!作为球队老大,你可能被算计

老梁体育漫谈
2026-02-19 00:04:53
巴萨vs吉罗纳VAR裁判无限期停哨;皇马vs皇社VAR裁判也被罚

巴萨vs吉罗纳VAR裁判无限期停哨;皇马vs皇社VAR裁判也被罚

隐于山海
2026-02-18 12:33:11
看着春晚,英媒想起马斯克这句:中国早就next level

看着春晚,英媒想起马斯克这句:中国早就next level

观察者网
2026-02-17 12:03:16
42万买200幅假画?母亲被嘲12年,直到女儿整理遗物才发现秘密

42万买200幅假画?母亲被嘲12年,直到女儿整理遗物才发现秘密

君好伴读
2026-01-24 15:15:30
湖北宜城烟花爆竹爆燃事故致12人死亡

湖北宜城烟花爆竹爆燃事故致12人死亡

环球网资讯
2026-02-18 19:14:13
建行储蓄卡未离身却遭连续盗刷,近1.5万元流向三省,深圳警方向三地警方发协查函

建行储蓄卡未离身却遭连续盗刷,近1.5万元流向三省,深圳警方向三地警方发协查函

大风新闻
2026-02-18 17:37:03
2026-02-19 01:39:00
腾讯技术工程
腾讯技术工程
不止于技术
1363文章数 600关注度
往期回顾 全部

科技要闻

怒烧45亿,腾讯字节阿里决战春节

头条要闻

27岁女子上门做年夜饭月入4.5万:一桌10个菜1888元

头条要闻

27岁女子上门做年夜饭月入4.5万:一桌10个菜1888元

体育要闻

首金!苏翊鸣唱国歌落泪 自信比1呐喊

娱乐要闻

明星过年百态!黄晓明等现身三亚

财经要闻

面条火腿香菇酱!上市公司这些年请你吃

汽车要闻

量产甲醇插混 吉利银河星耀6甲醇插混版申报图

态度原创

数码
旅游
时尚
手机
房产

数码要闻

谷歌 Android XR 设计文档曝光,安卓17流畅度提升

旅游要闻

“马上”喝咖去!打卡藏在崇明景区里的这些咖啡馆

马年壁纸送上,祝大家新年快乐,马上发财!

手机要闻

三星预热S26系列全新相机功能,AI修复画面、切换昼夜场景

房产要闻

三亚新机场,又传出新消息!

无障碍浏览 进入关怀版