node.js的上升:运行时如何更改网络
#javascript #node #deno #history

在我的JavaScript系列的第三篇文章中,让我们踏上记忆巷,当我们踏上诱人的旅程,以追踪JavaScript在服务器侧的征服的起源。在Node.js成为后端世界的宠儿之前,曾试图让JavaScript在浏览器外统治至高无上。让我们拨打时钟吧?

在互联网的胚胎时代,Netscape是大wig。除了向浏览器介绍JavaScript外,Netscape还有更宏伟的景象。输入Livewire Pro Web -Netscape的早期尝试使JavaScript在服务器上运行。它允许开发人员使用客户和服务器的共享JavaScript代码库来搅拌Web应用程序。听起来很熟悉?好吧,node.js并不是第一个怀有这个想法的人!

Netscape LiveWire Pro Web

由于Netscape试图用Livewire雕刻一个利基市场,Microsoft并没有落后。他们引入了ASP.NET JavaScript引擎(JSE),使开发人员可以与经典的ASP.NET技术同时使用JavaScript。尽管这是值得称赞的举动,但当时将JavaScript推到服务器端技术的顶峰还不够。

但是有人想知道,为什么这些早期的化身不会像Node.js一样席卷世界?

  • 技术成熟度:Internet和JavaScript都在他们的企业中。生态系统正在不断发展,技术堆栈还不够成熟,无法应付迅速增加Web应用程序的需求。
  • 性能瓶颈:JavaScript的早期发动机不如今天为Node.js提供动力的V8引擎。因此,服务器端JS经常应对性能挑战。
  • 更紧密的耦合:与模块化方法Node.js带到表中不同,早期的服务器端JavaScript解决方案通常与特定的服务器配置和软件纠缠在一起。缺乏灵活性是开发人员的关闭。
  • Market Dynamics :Microsoft的JSE正在与传统服务器端语言(如PHP,Perl和ASP.NET的C#)等传统服务器端语言的统治地位作斗争。
  • 可见性和社区支持:Node.js以开源爱情和新兴的NPM社区为生。早期的服务器端JS没有如此庞大的社区驱动势头的奢侈。

总而言之,Tech Cosmos还没有为JavaScript的服务器端接管做好准备。尽管Livewire和Asp.net JSE的想法是有远见的,但他们也许已经领先于时代。但是,正如我们所知,好主意有一种重新铺面的方式。它花了一些迭代,一些技术飞跃和一大堆社区的爱,最终生育了我们现在亲切地称为node.js。

出生和早期(2009年)

这一年是2009年。在已建立的服务器端泰坦(PHP),Ruby On Rails和Django(为竞技场)准备的新战士中。一个名叫瑞安·达尔(Ryan Dahl)的谦卑家伙向世界提出了:Node.js

Node.js Logo

灵感的耳语

node.js的核心是打破模具的愿望。 Web应用程序开发正在碰到瓶颈,并具有盛行的体系结构。可伸缩性和效率是小时的需求,瑞安·达尔(Ryan Dahl)受到启发来解决这些问题。 Node.js不仅要将JavaScript带到服务器;这是关于重新想象Web应用程序如何通信和运行。

const http = require('http');

http.createServer((request, response) => {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello, World!\n');
}).listen(8080);

console.log('Server running at http://localhost:8080/');

这个简约的“你好,世界!”服务器证明了引入的简单性和幂node.js。

V8:引擎盖下的动力室

V8 Engine

虽然服务器端JavaScript的想法不是新颖的,但哪些动力node.js是!由Google为Chrome诞生的V8 engine现在正在驾驶Node.js,为JavaScript执行带来了无与伦比的速度和性能。

function fastOperation() {
  let sum = 0;
  for (let i = 0; i < 1000000; i++) {
    sum += i;
  }
  return sum;
}

console.log(fastOperation()); // Showcases the raw speed of V8.

沟渠线:事件驱动的涅磐

node.js与传统的基于线程的模型背道而驰。相反,它包含了事件驱动的非阻滞I/O模型。这意味着在等待文件读数或获取API时,Node.js可以处理其他任务。没有线程等待的线程!这使Node.js的传奇能力能够处理数千个并发连接,而​​开销最少。

const fs = require('fs');

fs.readFile('/path/to/file', (err, data) => {
  if (err) throw err;
  console.log(data);
});

console.log('Reading file...'); // This will print before the file data, showcasing non-blocking nature.

当天的巨人与新孩子

现在,让我们对node.js对抗同时代人:

  1. php :尽管PHP拥有丰富的生态系统和悠久的历史,但传统上使用了多线程,阻止模型。每个传入连接通常会产生一个新线程,消耗更多的内存。

  2. rails上的红宝石RoR是一个优雅的,惯例的构造框架。但是,它也通常遵循基于线程的阻塞模型。

  3. django Django,其“电池”哲学在内,为网络开发提供了全面的套件。然而,它主要是同步的,依靠工作过程或线程。

node.js?它吹嘘了事件驱动的体系结构,使用回调来发出信号完成或失败,从而使高度并发率更少。

祖先影响node.js

虽然node.js是革命性的,但并非孤立地出生。 Dahl从各种语言和系统中汲取灵感:

  • Python的扭曲和Ruby的Eventmachine :对于他们的事件驱动的体系结构。

  • java :凭借其庞大的网络库和并发处理功能,它提供了有关采用什么和避免什么陷阱的经验教训。

  • Ruby :拥有类似RubyGems的包装经理的想法诞生了NPM,NPM是Node.js生态系统的基石。

Node.js的早期充满了诺言和创新。从过去汲取灵感,再加上更快,更可扩展的Web的愿景,Node.js铺成了服务器端的明星。随着人气的流行,社区引起了人们的注意,导致了一段迅速发展的时期。

社区Blossom and Homky(2010-2015)

node.js将其第一步迈进了世界,这不是许多人可能会想到的孤独之旅。随着社区的集会,2010年至2015年之间的时期看到了令人振奋的开花,它将在未来几年内塑造Node.js景观。

魔术药:NPM

NPM Logo

如果Node.js是英雄,则NPM(Node Package Manager)是其可信赖的搭档。 NPM出于共享和重复使用代码的需求,对Node.js做了RubyGems为Ruby所做的事情。它不仅仅是一个包装经理;这是一个推动者。轻松,开发人员可以吸引无数的图书馆或“包裹”来增强其应用程序。

npm install express

这个简单的命令启动了许多节点。

开源福音

node.js从一开始就打开了。这种透明度是其超级大国,邀请全球开发人员贡献,迭代和精炼。随着拉的请求的流动,node.js的进化速度也是如此。 Isaac Schlueter,TJ Holowaychuk等著名贡献者以及许多其他贡献者在Node.js Core和Ecosystem上盖章。

基金会的基岩

随着社区的膨胀,需要有组织的治理。在2015年输入Node.js基金会。尽管有授权加速开发并促进广泛采用,因此基金会成为了所需的管家Node.js。

OpenJS Foundation

它为协作,合作伙伴关系和功能优先级提供了一个结构化的环境。 2019年,它与JS基金会合并,成为更强大的OpenJS Foundation

道路上的简短分叉:io.js

现在,任何值得盐的故事都有一个扭曲。对于Node.js而言,这是2014年下半年的IO.JS叉子。出生于社区内的分歧,尤其是在项目缓慢的发展速度和Joyent的joyent(当时Node.js的管家)的治理政策IO围绕IO。 JS是一个平行的项目,可以更快地引入多个功能。

但是,像任何经典的故事一样,和解即将到来。在2015年的一次令人心动的聚会中,io.js与node.js基金会下的node.js合并,确保了一个统一,健壮的平台。

节点的骑士。

框架和库涌动,构成了node.js应用程序开发过程。以下是一些示例:

  • ExpressJS :这个简约的Web应用程序框架成为构建Web应用程序和API的首选。它的简单性和灵活性使其成为社区的宠儿。
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello Express!');
});

app.listen(3000, () => {
  console.log('Express app listening on port 3000!');
});
  • Mongoose :提供优雅的MongoDB对象建模,Node.js Apps中的Mongoose简化数据库交互。
  • Passport :随着身份验证变得至关重要,护照介入以最少的大惊小怪提供多样化的身份验证策略。

回调和批评

随着增长的挑战。臭名昭著的“回调地狱”困扰着早期的日子,嵌套的回调层导致了混乱,不可读的代码。诺言和后来的异步/等待,以减轻这种情况。

// Callback hell example
fs.readFile(filename, 'utf8', function(err, data) {
  if (err) throw err;
  parseFile(data, function(err, parsedData) {
    if (err) throw err;
    writeFile(parsedData, function(err) {
      if (err) throw err;
      console.log('Data written!');
    });
  });
});

行业巨头拥抱Node.js

主要参与者注意到并登上了Node.js船:

  • LinkedIn :将其移动后端迁移到Node.js,吹捧提高的性能和可扩展性。

  • uber :Abspained node.js的大规模匹配系统,利用其非阻滞I/O来处理大量同时乘车请求。

  • 沃尔玛:通过重新平台将node.js堆栈转向头,旨在改善移动客户体验。

从包装管理的奇迹到社区领导的叉子,从框架创新到包含技术Node.js的行业大wig,有一个十年的过山车。它的故事是增长,社区,挑战和对创新的无情追求。

ES6杠杆和新功能(2015-)

随着ES6的引入(2015年Ecmascript),JavaScript的景观急剧转变

ECMAScript 6

和node.js就在最前沿,吸收和实现了这些开创性的功能。

2015年:功能交响曲

  • 箭头功能:这些简洁,优雅的构造不仅使代码清洁器,而且可以绑定this值。许多开发人员的主要救济!
const greet = name => `Hello, ${name}!`;
  • 承诺:承诺使异步代码更易于管理和可读。 “厄运金字塔”的回调链已经一去不复返了。
fetchData()
  .then(data => processData(data))
  .then(result => displayResult(result))
  .catch(error => console.error(error));
  • 破坏,传播/休息运算符,模板文字 ...等等,使代码库变得更加顺畅,更有效。

2017年:已久的英雄

使用async/await,异步代码看起来并感觉同步。结果?一种更干净,更直观的方法,驱动了回调地狱棺材的最后指甲。

async function fetchDataAndProcess() {
  try {
    let data = await fetchData();
    let result = await processData(data);
    console.log(result);
  } catch (error) {
    console.error(`Error: ${error}`);
  }
}

2019年:工人线程

虽然Node.js的单线程事件循环蓬勃发展,但CPU结合的任务是其致命的脚跟。工人线程进行了救援,允许并行执行线程并优化CPU核心利用率。

const { Worker, isMainThread } = require('worker_threads');

if (isMainThread) {
  const worker = new Worker('./pathToWorkerFile.js');
  worker.on('message', message => console.log(message));
} else {
  // Worker thread code
}

其他雄伟的变化

  • serverless :Node.js成为无服务器功能的首选选择,这要归功于其快速的启动和事件驱动的性质。 lambda函数,Azure函数以及带有张开臂的node.js。

  • 打字稿:虽然不是node.js特征,但TypeScript的生长是与node.js协同的JavaScript的强型超级,提供静态键入和未来的JS特征。 /p>

  • 性能提升:V8发动机改进,更好的垃圾收集和核心制作的Node.js的优化甚至更快。

  • 工具中的增长:像Babel这样的工具使开发人员可以使用最新的JavaScript功能而无需等待Node.js支持,而Webpack简化了捆绑和模块加载。

骑行:框架演变

框架演变为利用这些新功能的全部力量,例如:

  • koa.js :由Express背后的团队Koa.js利用异步/等待中间件,从而产生了更清洁和更可读的代码。

  • sails.js Sails.js作为Node.js的MVC框架,带来了类似铁轨的体验,同时成为数据库Agnostic。

2015年后时代不仅仅是功能添加。这是关于成熟,精炼和到达新的视野。正如Node.js所接受的现代JavaScript一样,整个生态系统都获得了好处。由此产生的功能,表演和社区精神的协同作用为Node.js Saga中的下一章铺平了道路。

Deno替代品(2018)

如果Geeks不仅仅是新的技术创新,这是一种救赎弧线。当瑞安·达尔(Ryan Dahl)在2018年登台并介绍了“我对node.js的10件事”时,技术领域席卷了自己。随后的不仅是内省,而且是新鲜创新的运行时的诞生: Deno

Deno Logo

达尔(Dahl)锻造Deno的理由

  • 反思和遗憾:瑞安·达尔(Ryan Dahl)在node.js上的回顾性凝视带来了他希望纠正的设计不完美的清单。作为任何充满激情的创造者,他不满足于指出缺陷。相反,他的目标是解决方案。

  • 安全性第一:一个很大的遗憾是Node.js对网络和文件系统的开放访问,这引起了安全问题。与形成鲜明对比的是,Deno采用了安全优先的方法。默认情况下,除非明确授予许可,否则脚本无法访问文件系统,环境或网络。

deno run --allow-net server.ts

NPM争议和Deno的替代方案

  • Joyent的管理:在Joyent下对NPM的集中控制导致呼吁进行更多的公开治理。瑞安·达尔(Ryan Dahl)是那些认为模块不应围绕一个由单个实体控制的大型重复的人之一。

  • Deno的模块方法:Deno通过利用URL作为模块标识符采取了不同的途径,与NPM的方法相去甚远。这意味着没有Deno的集中式包装经理。相反,依赖项直接从URL导入,导致分散的模块分布。

import { serve } from "https://deno.land/std@0.75.0/http/server.ts";

对比巨人:node.js vs. deno

  • 用生锈和打字稿编写:node.js构建在C ++上时,Deno是用Rust构建的,Typescript是一流的公民。

  • 单个可执行文件:deno是一个无依赖项的单个可执行文件,使其可移植且直接设置。

  • 集成工具:DENO与内置软件包管理器,测试跑步者和Bundler一起发货,使第三方工具比Node.js Ecosystem中的关键不那么关键。

为什么Deno没有Eclipse node.js

deno的出现是经典的老人与新来的故事,但推翻了像node.js这样的巨人。

  • 成熟度:Node.js通过NPM进行了十年的启动,庞大的社区和广泛的模块生态系统。资源,知识和工具的深度为其带来了重要的优势。

  • 企业采用:围绕Node.js构建的系统的大公司不会很快改变。过渡将涉及重新进行,重构和测试,所有这些都花费时间和金钱。

  • 绩效奇偶校验:虽然Deno带来了新颖的功能,但其最初发行版的性能与Node.js相当。这是开发人员切换的足够理由。

deno本身就是一个惊人的运行时间,但他是瑞安·达尔(Ryan Dahl)试图制作更完美的node.js的尝试。它封装了新的想法,安全措施和工具。但是,除了巨大的节点。

Node.js的光明未来

当我们巡游Node.js Universe的宇宙高速公路时,地平线下降了,具有闪烁的新颖性和技术,似乎与我们心爱的运行时无缝融合。让我们探索将来等待Node.js的勇敢的新世界!

无服务器的不可阻挡的上升

无服务器计算曾经听起来像科幻行话的短语迅速成为开发人员领域中最热门的流行语之一。但是,是什么使Node.js成为此乐章的宠儿?

  • 即时启动:node.js应用程序,轻量级,在冷启动时很擅长。在无服务器的环境中,可以旋转或按需拆卸功能,这是至关重要的。

  • 事件驱动的自然:无服务器的灵魂正在响应事件,无论是HTTP请求,数据库修改还是排队的消息。 Node.js凭借其事件驱动的架构,在这里感觉很宾至如归。

// A simple AWS Lambda function with Node.js
const { S3 } = require('aws-sdk');

exports.handler = async (event) => {
    const s3 = new S3();
    const params = { /*...*/ };  // Parameters for S3 operations

    const data = await s3.getObject(params).promise();
    return data;
};

完美的舞蹈:node.js和微服务

Microservices架构具有模块化,可扩展的设计和node.js,似乎是彼此制作的。原因是:

  • 轻量级运行时:node.js的小足迹意味着每个服务都可以在自己的过程中运行而无需资源。

  • 快速开发:使用扩展的NPM生态系统,开发人员可以快速原型和部署单个服务。

  • 跨职能团队:Node.js的平易近人本性使前端开发人员进入后端领域,促进微服务开发中的协作。

// An ExpressJS microservice for user authentication
const express = require('express');
const app = express();
const port = 3000;

app.post('/auth', (req, res) => {
    // Handle authentication logic
    res.send('Authenticated!');
});

app.listen(port, () => {
    console.log(`Auth service listening at http://localhost:${port}`);
});

脑波:与node.js的ML/AI集成

机器学习和人工智能不再保留给Python和R.与现代图书馆和节点。

  • TensorFlow.js :Google的受欢迎的ML库有一个node.js变体,使开发人员可以在其JS应用程序中训练和部署模型。

  • Natural :node.js的自然语言处理库,使应用程序能够理解人类语言,象征性等等。

const tf = require('@tensorflow/tfjs-node');

// Define, train, and run a simple model in Node.js
const model = tf.sequential();
// ... Model definition and training

const prediction = model.predict(tf.tensor2d([5], [1, 1]));
console.log(prediction.dataSync());

node.js的潜在路径沿无数方向延伸,每个方向都比最后一个更具诱人。无论是无服务器的短暂性,微服务的复杂舞蹈还是ML和Ai node.js的巧妙领域已经植入了旗帜,没有显示速度放慢的迹象。

随着我们的数字船只接近目的地,很明显:node.js的黄金时代不仅在其传说中的过去,而且在其前途的未来中明亮地阐明了。

结论

当我们在我们的数字航天器上浏览注册的宇宙时,回想起Node.js的出色旅程时,一件事变得明确清楚:我们心爱的运行时已经穿越了星系,从它的日子里,这是Ryan在Ryan中的雄心勃勃的想法Dahl对服务器端逻辑的统治地位。

到无限和...那边是什么?

当我们涉足AI和无服务器的奇迹时,宇宙的广阔是没有探索的。有潜力:

  • 物联网(IoT):随着设备变得更聪明,房屋更加连接,Node.js很可能是您的咖啡机和闹钟之间的桥梁,从而确保前者开始酿造后者的那一刻熄灭。
const coffeeMachine = require('smart-coffee-machine');
const alarmClock = require('smart-alarm');

alarmClock.on('ring', () => {
    coffeeMachine.brew('medium-dark');
});
  • 增强现实(AR)和虚拟现实(VR):随着我们的数字和物理领域的合并,Node.js可能只在管理数据,处理请求和提供实时更新方面起着关键作用沉浸式体验。

然而,在这个银河扩张中挑战

  • 可持续性:node.js的开源性质既是它的强度,又是其致命弱点。保持热情,推动创新并确保社区的持续支持至关重要。

  • 可维护性:随着Node.js的继续发展,保持向后兼容性而无需扼杀创新是一条绳索步行。

  • 竞争:在这个广阔的宇宙中,新星每一刻都出生。像Deno或新兴技术这样的运行时间可能会挑战Node.js的至高无上。

  • 复杂性:随着扩展的生态系统,新开发人员可能会发现潜入node.js。简化入职和保持学习曲线的温和至关重要。

从谦虚的开端到广泛的收养,Node.js的故事是毅力,创新和社区之一。就像点缀着我们宇宙冠层的星星一样,挑战和竞争对手将永远出现,但是Node.js凭借其充满活力的社区,需要继续亮着光明。

正如我们的航行结束时,我们在熟悉的地形上,很明显,虽然我们走了很远,但node.js的宇宙仍然拥有未知的星系,等待勇敢的灵魂探索。因此,怪胎同伴,在Node.js领域中遇到了好奇心和支撑的大火。最好的是