- About Node.js®
- Node js ��� ������
- News from 2021
- Corepack
- Руководство по Node.js, часть 1: общие сведения и начало работы
- Обзор Node.js
- ▍Скорость
- ▍Простота
- ▍JavaScript
- ▍Движок V8
- ▍Асинхронность
- ▍Библиотеки
- Установка Node.js
- Первое Node.js-приложение
- Фреймворки и вспомогательные инструменты для Node.js
- Краткая история Node.js
About Node.js®
As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications. In the following «hello world» example, many connections can be handled concurrently. Upon each connection, the callback is fired, but if there is no work to be done, Node.js will sleep.
This is in contrast to today’s more common concurrency model, in which OS threads are employed. Thread-based networking is relatively inefficient and very difficult to use. Furthermore, users of Node.js are free from worries of dead-locking the process, since there are no locks. Almost no function in Node.js directly performs I/O, so the process never blocks except when the I/O is performed using synchronous methods of Node.js standard library. Because nothing blocks, scalable systems are very reasonable to develop in Node.js.
If some of this language is unfamiliar, there is a full article on Blocking vs. Non-Blocking.
Node.js is similar in design to, and influenced by, systems like Ruby’s Event Machine and Python’s Twisted. Node.js takes the event model a bit further. It presents an event loop as a runtime construct instead of as a library. In other systems, there is always a blocking call to start the event-loop. Typically, behavior is defined through callbacks at the beginning of a script, and at the end a server is started through a blocking call like EventMachine::run() . In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js exits the event loop when there are no more callbacks to perform. This behavior is like browser JavaScript — the event loop is hidden from the user.
HTTP is a first-class citizen in Node.js, designed with streaming and low latency in mind. This makes Node.js well suited for the foundation of a web library or framework.
Node.js being designed without threads doesn’t mean you can’t take advantage of multiple cores in your environment. Child processes can be spawned by using our child_process.fork() API, and are designed to be easy to communicate with. Built upon that same interface is the cluster module, which allows you to share sockets between processes to enable load balancing over your cores.
В© OpenJS Foundation. All Rights Reserved. Portions of this site originally В© Joyent.
Источник
Node js ��� ������
Toggle Language
- Ш§Щ„Ш№Ш±ШЁЩЉШ©
- Catalan
- Deutsch
- English
- EspaГ±ol
- ШІШЁШ§Щ† ЩЃШ§Ш±ШіЫЊ
- FranГ§ais
- Galego
- Italiano
- ж—Ґжњ¬иЄћ
- н•њкµм–ґ
- PortuguГЄs do Brasil
- limba romГўnДѓ
- Р СѓСЃСЃРєРёР№
- TГјrkГ§e
- Українська
- з®ЂдЅ“дёж–‡
- з№Ѓй«”дёж–‡
News from 2021
- crypto
- update root certificates (Richard Lau) #40280
- deps
- upgrade npm to 8.0.0 (npm team) #40369
- update nghttp2 to v1.45.1 (thunder-coding) #40206
- update V8 to 9.4.146.19 (Michaël Zasso) #40285
- tools
- update certdata.txt (Richard Lau) #40280
tl;dr: we’re going to be retiring the Node.js Community Committee, moving our existing Initiatives to exist under the Node.js Technical Steering Committee (TSC).
From the Community Committee’s side, we’ve seen a convergence of our initiatives’ goals with the goals of the work that is generally under the TSC. Further, we’ve seen a decline in the number of people who can consistently dedicate the necessary amount of time/energy. As such, separation between the TSC and Community Committee has become more of a barrier to accomplishing our collective goals rather than the helpful and necessary construct it once was.
The Node.js project will release new versions of the 12.x, 14.x, and 16.x releases lines on or shortly after Tuesday
October 12th, 2021 in order to address:
- Two medium severity issues
The 16.x release line of Node.js is vulnerable to two medium severity issues.
The 14.x release line of Node.js is vulnerable to two medium severity issues.
- [ 3a60de0135 ] — assert: change status of legacy asserts (James M Snell) #38113
- [ df37c106a7 ] — (SEMVER-MINOR)buffer: introduce Blob (James M Snell) #36811
- [ 223494c548 ] — (SEMVER-MINOR)buffer: add base64url encoding option (Filip Skokan) #36952
- [ 14fc4ddabc ] — (SEMVER-MINOR)child_process: allow options.cwd receive a URL (Khaidi Chu) #38862
- [ b68b13acb3 ] — (SEMVER-MINOR)child_process: add timeout to spawn and fork (Nitzan Uziely) #37256
- [ da98c9f99b ] — (SEMVER-MINOR)child_process: allow promisified exec to be cancel (Carlos Fuentes) #34249
- [ 779310ac87 ] — (SEMVER-MINOR)child_process: add ‘overlapped’ stdio flag (Thiago Padilha) #29412
- [ 40eb3b79f1 ] — (SEMVER-MINOR)cli: add -C alias for —conditions flag (Guy Bedford) #38755
- [ 39eba0a2e1 ] — (SEMVER-MINOR)cli: add —node-memory-debug option (Anna Henningsen) #35537
- [ d8d9a9628a ] — (SEMVER-MINOR)dns: add «tries» option to Resolve options (Luan Devecchi) #39610
- [ 15ba19b020 ] — (SEMVER-MINOR)dns: allow —dns-result-order to change default dns verbatim (Ouyang Yadong) #38099
- [ 307c1d817f ] — doc: refactor fs docs structure (James M Snell) #37170
- [ 9ee3f77e32 ] — (SEMVER-MINOR)errors: remove experimental from —enable-source-maps (Benjamin Coe) #37362
- [ e73bfed2f4 ] — esm: deprecate legacy main lookup for modules (Guy Bedford) #36918
- [ 989c204a58 ] — (SEMVER-MINOR)fs: allow empty string for temp directory prefix (Voltrex) #39028
- [ ef72490cde ] — (SEMVER-MINOR)fs: allow no-params fsPromises fileHandle read (Nitzan Uziely) #38287
- [ cad9d20f64 ] — (SEMVER-MINOR)fs: add support for async iterators to fsPromises.writeFile (HiroyukiYagihashi) #37490
- [ 2b0e2706c0 ] — fs: improve fsPromises readFile performance (Nitzan Uziely) #37608
- [ fe12cc07b3 ] — (SEMVER-MINOR)fs: add fsPromises.watch() (James M Snell) #37179
- [ 2459c115a8 ] — (SEMVER-MINOR)fs: allow position parameter to be a BigInt in read and readSync (Darshan Sen) #36190
- [ 6544cfb4b9 ] — (SEMVER-MINOR)http2: add support for sensitive headers (Anna Henningsen) #34145
- [ a6c6cbb4e6 ] — (SEMVER-MINOR)http2: allow setting the local window size of a session (Yongsheng Zhang) #35978
- [ 1e5aca550c ] — inspector: mark as stable (Gireesh Punathil) #37748
- [ 93af04afbb ] — (SEMVER-MINOR)module: add support for URL to import.meta.resolve (Antoine du Hamel) #38587
- [ f9f9389d83 ] — (SEMVER-MINOR)module: add support for node: ‑prefixed require(…) calls (ExE Boss) #37246
- [ 87c71065eb ] — (SEMVER-MINOR)net: introduce net.BlockList (James M Snell) #34625
- [ b421d99a48 ] — (SEMVER-MINOR)node-api: allow retrieval of add-on file name (Gabriel Schulhof) #37195
- [ 6a4811df8a ] — (SEMVER-MINOR)os: add os.devNull (Luigi Pinca) #38569
- [ 4a88ddeeca ] — (SEMVER-MINOR)perf_hooks: introduce createHistogram (James M Snell) #37155
- [ 1a6bf1c4a3 ] — (SEMVER-MINOR)process: add api to enable source-maps programmatically (legendecas) #39085
- [ 99735a6fe8 ] — (SEMVER-MINOR)process: add ‘worker’ event (James M Snell) #38659
- [ 3982919317 ] — (SEMVER-MINOR)process: add direct access to rss without iterating pages (Adrien Maret) #34291
- [ 526e6c7bde ] — (SEMVER-MINOR)readline: add AbortSignal support to interface (Nitzan Uziely) #37932
- [ e6eee08692 ] — (SEMVER-MINOR)readline: add support for the AbortController to the question method (Mattias Runge-Broberg) #33676
- [ 32de361d70 ] — (SEMVER-MINOR)readline: add history event and option to set initial history (Mattias Runge-Broberg) #33662
- [ 797f7f8a38 ] — (SEMVER-MINOR)repl: add auto‑completion for node: ‑prefixed require(…) calls (ExE Boss) #37246
- [ abfd71b64c ] — (SEMVER-MINOR)src: call overload ctor from the original ctor (Darshan Sen) #39768
- [ 1efae01b18 ] — (SEMVER-MINOR)src: add a constructor overload for CallbackScope (Darshan Sen) #39768
- [ f7933804ba ] — (SEMVER-MINOR)src: allow to negate boolean CLI flags (Michaël Zasso) #39023
- [ 6d06ac2202 ] — (SEMVER-MINOR)src: add —heapsnapshot-near-heap-limit option (Joyee Cheung) #33010
- [ 577d228ca0 ] — (SEMVER-MINOR)src: add way to get IsolateData and allocator from Environment (Anna Henningsen) #36441
- [ 658a266cd4 ] — (SEMVER-MINOR)src: allow preventing SetPrepareStackTraceCallback (Shelley Vohr) #36447
- [ f421422ea4 ] — (SEMVER-MINOR)src: add maybe versions of EmitExit and EmitBeforeExit (Anna Henningsen) #35486
- [ a62d4d60f4 ] — (SEMVER-MINOR)stream: add readableDidRead if has been read from (Robert Nagy) #39589
- [ 63502131a3 ] — (SEMVER-MINOR)stream: pipeline accept Buffer as a valid first argument (Nitzan Uziely) #37739
- [ 68bbebd42c ] — (SEMVER-MINOR)tls: allow reading data into a static buffer (Andrey Pechkurov) #35753
- [ 1cbb74d63d ] — (SEMVER-MINOR)url: expose urlToHttpOptions utility (Yongsheng Zhang) #35960
- [ 8eb11356dd ] — (SEMVER-MINOR)util: expose toUSVString (Robert Nagy) #39814
- [ 84fcdc3074 ] — (SEMVER-MINOR)v8: implement v8.stopCoverage() (Joyee Cheung) #33807
- [ b238b6bf17 ] — (SEMVER-MINOR)v8: implement v8.takeCoverage() (Joyee Cheung) #33807
- [ 9f6bc58da8 ] — (SEMVER-MINOR)worker: add setEnvironmentData/getEnvironmentData (James M Snell) #37486
- [ fb226ff2ee ] — (SEMVER-MINOR)crypto: add rsa-pss keygen parameters (Filip Skokan) #39927
- [ 85206b7311 ] — deps: upgrade npm to 7.24.0 (npm team) #40167
- [ 98f56d179c ] — deps: update Acorn to v8.5.0 (Michaël Zasso) #40015
- [ 9655329772 ] — doc: add Ayase-252 to collaborators (Qingyu Deng) #40078
- [ 59fff925be ] — (SEMVER-MINOR)fs: make open and close stream override optional when unused (Antoine du Hamel) #40013
- [ a63a4bce90 ] — (SEMVER-MINOR)http: limit requests per connection (Artur K) #40082
- The maximum number of requests a socket can handle before closing keep alive connection can be set with server.maxRequestsPerSocket .
- [ 9a672961fa ] — (SEMVER-MINOR)src: add —no-global-search-paths cli option (Cheng Zhao) #39754
- Adds the —no-global-search-paths command-line option to not search modules from global paths like $HOME/.node_modules and $NODE_PATH .
- [ fe920b6cbf ] — (SEMVER-MINOR)src: make napi_create_reference accept symbol (JckXia) #39926
- [ 97f3072ceb ] — (SEMVER-MINOR)stream: add signal support to pipeline generators (Robert Nagy) #39067
This release fixes a regression introduced by the V8 9.3 update in Node.js 16.9.0.
- [ 04f1943109 ] — deps: V8: cherry-pick 9a607043cb31 (Jiawen Geng) #40046
Corepack
Node.js now includes Corepack, a script that acts as a bridge between Node.js projects and the package managers they are intended to be used with during development. In practical terms, Corepack will let you use Yarn and pnpm without having to install them — just like what currently happens with npm, which is shipped in Node.js by default. Please head over to the Corepack documentation page for more information on how to use it.
Updates are now available for v14.x, and v12.x Node.js release lines for the following issues.
These are vulnerabilities in the node-tar, arborist, and npm cli modules which are related to the initial reports and subsequent remediation of node-tar vulnerabilities CVE-2021-32803 and CVE-2021-32804. Subsequent internal security review of node-tar and additional external bounty reports have resulted in another 5 CVE being remediated in core npm CLI dependencies including node-tar, and npm arborist.
These are vulnerabilities in the node-tar, arborist, and npm cli modules which are related to the initial reports and subsequent remediation of node-tar vulnerabilities CVE-2021-32803 and CVE-2021-32804. Subsequent internal security review of node-tar and additional external bounty reports have resulted in another 5 CVE being remediated in core npm CLI dependencies including node-tar, and npm arborist.
These are vulnerabilities in the node-tar, arborist, and npm cli modules which are related to the initial reports and subsequent remediation of node-tar vulnerabilities CVE-2021-32803 and CVE-2021-32804. Subsequent internal security review of node-tar and additional external bounty reports have resulted in another 5 CVE being remediated in core npm CLI dependencies including node-tar, and npm arborist.
В© OpenJS Foundation. All Rights Reserved. Portions of this site originally В© Joyent.
Источник
Руководство по Node.js, часть 1: общие сведения и начало работы
Мы начинаем публикацию серии материалов, которые представляют собой поэтапный перевод руководства по Node.js для начинающих. А именно, в данном случае «начинающий» — это тот, кто обладает некоторыми познаниями в области браузерного JavaScript. Он слышал о том, что существует серверная платформа, программы для которой тоже пишут на JS, и хотел бы эту платформу освоить. Возможно, вы найдёте здесь что-то полезное для себя и в том случае, если уже знакомы с Node.js.
Кстати, в прошлом году у нас был похожий по масштабам проект, посвящённый bash-скриптам. Тогда мы, после публикации всех запланированных материалов, собрали их в виде PDF-файла. Так же планируется поступить и в этот раз.
Сегодня мы обсудим особенности Node.js, начнём знакомство с экосистемой этой платформы и напишем серверный «Hello World».
Обзор Node.js
Node.js — это опенсорсная кроссплатформенная среда выполнения для JavaScript, которая работает на серверах. С момента выпуска этой платформы в 2009 году она стала чрезвычайно популярной и в наши дни играет весьма важную роль в области веб-разработки. Если считать показателем популярности число звёзд, которые собрал некий проект на GitHub, то Node.js, у которого более 50000 звёзд, это очень и очень популярный проект.
Платформа Node.js построена на базе JavaScript движка V8 от Google, который используется в браузере Google Chrome. Данная платформа, в основном, используется для создания веб-серверов, однако сфера её применения этим не ограничивается.
Рассмотрим основные особенности Node.js.
▍Скорость
Одной из основных привлекательных особенностей Node.js является скорость. JavaScript-код, выполняемый в среде Node.js, может быть в два раза быстрее, чем код, написанный на компилируемых языках, вроде C или Java, и на порядки быстрее интерпретируемых языков наподобие Python или Ruby. Причиной подобного является неблокирующая архитектура платформы, а конкретные результаты зависят от используемых тестов производительности, но, в целом, Node.js — это очень быстрая платформа.
▍Простота
Платформа Node.js проста в освоении и использовании. На самом деле, она прямо-таки очень проста, особенно это заметно в сравнении с некоторыми другими серверными платформами.
▍JavaScript
В среде Node.js выполняется код, написанный на JavaScript. Это означает, что миллионы фронтенд-разработчиков, которые уже пользуются JavaScript в браузере, могут писать и серверный, и клиентский код на одном и том же языке программирования без необходимости изучать совершенно новый инструмент для перехода к серверной разработке.
В браузере и на сервере используются одинаковые концепции языка. Кроме того, в Node.js можно оперативно переходить на использование новых стандартов ECMAScript по мере их реализации на платформе. Для этого не нужно ждать до тех пор, пока пользователи обновят браузеры, так как Node.js — это серверная среда, которую полностью контролирует разработчик. В результате новые возможности языка оказываются доступными при установке поддерживающей их версии Node.js.
▍Движок V8
В основе Node.js, помимо других решений, лежит опенсорсный JavaScript-движок V8 от Google, применяемый в браузере Google Chrome и в других браузерах. Это означает, что Node.js пользуется наработками тысяч инженеров, которые сделали среду выполнения JavaScript Chrome невероятно быстрой и продолжают работать в направлении совершенствования V8.
▍Асинхронность
В традиционных языках программирования (C, Java, Python, PHP) все инструкции, по умолчанию, являются блокирующими, если только разработчик явным образом не позаботится об асинхронном выполнении кода. В результате если, например, в такой среде, произвести сетевой запрос для загрузки некоего JSON-кода, выполнение потока, из которого сделан запрос, будет приостановлено до тех пор, пока не завершится получение и обработка ответа.
JavaScript значительно упрощает написание асинхронного и неблокирующего кода с использованием единственного потока, функций обратного вызова (коллбэков) и подхода к разработке, основанной на событиях. Каждый раз, когда нам нужно выполнить тяжёлую операцию, мы передаём соответствующему механизму коллбэк, который будет вызван сразу после завершения этой операции. В результате, для того чтобы программа продолжила работу, ждать результатов выполнения подобных операций не нужно.
Подобный механизм возник в браузерах. Мы не можем позволить себе ждать, скажем, окончания выполнения AJAX-запроса, не имея при этом возможности реагировать на действия пользователя, например, на щелчки по кнопкам. Для того чтобы пользователям было удобно работать с веб-страницами, всё, и загрузка данных из сети, и обработка нажатия на кнопки, должно происходить одновременно, в режиме реального времени.
Если вы создавали когда-нибудь обработчик события нажатия на кнопку, то вы уже пользовались методиками асинхронного программирования.
Асинхронные механизмы позволяют единственному Node.js-серверу одновременно обрабатывать тысячи подключений, не нагружая при этом программиста задачами по управлению потоками и по организации параллельного выполнения кода. Подобные вещи часто являются источниками ошибок.
Node.js предоставляет разработчику неблокирующие базовые механизмы ввода вывода, и, в целом, библиотеки, использующиеся в среде Node.js, написаны с использованием неблокирующих парадигм. Это делает блокирующее поведение кода скорее исключением, чем нормой.
Когда Node.js нужно выполнить операцию ввода-вывода, вроде загрузки данных из сети, доступа к базе данных или к файловой системе, вместо того, чтобы заблокировать ожиданием результатов такой операции главный поток, Node.js инициирует её выполнение и продолжает заниматься другими делами до тех пор, пока результаты выполнения этой операции не будут получены.
▍Библиотеки
Благодаря простоте и удобству работы с менеджером пакетов для Node.js, который называется npm, экосистема Node.js прямо-таки процветает. Сейчас в реестре npm имеется более полумиллиона опенсорсных пакетов, которые может свободно использовать любой Node.js-разработчик.
Рассмотрев некоторые основные особенности платформы Node.js, опробуем её в действии. Начнём с установки.
Установка Node.js
Node.js можно устанавливать различными способами, которые мы сейчас рассмотрим.
Так, официальные установочные пакеты для всех основных платформ можно найти здесь.
Существует ещё один весьма удобный способ установки Node.js, который заключается в использовании менеджера пакетов, имеющегося в операционной системе. Например, менеджер пакетов macOS, который является фактическим стандартом в этой области, называется Homebrew. Если он в вашей системе есть, вы можете установить Node.js, выполнив эту команду в командной строке:
Список менеджеров пакетов для других операционных систем, в том числе — для Linux и Windows, можно найти здесь.
Популярным менеджером версий Node.js является nvm. Это средство позволяет удобно переключаться между различными версиями Node.js, с его помощью можно, например, установить и попробовать новую версию Node.js, после чего, при необходимости, вернуться на старую. Nvm пригодится и в ситуации, когда нужно испытать какой-нибудь код на старой версии Node.js.
Я посоветовал бы начинающим пользоваться официальными установщиками Node.js. Пользователям macOS я порекомендовал бы устанавливать Node.js с помощью Homebrew. Теперь, после того, как вы установили Node.js, пришло время написать «Hello World».
Первое Node.js-приложение
Самым распространённым примером первого приложения для Node.js можно назвать простой веб-сервер. Вот его код:
Для того чтобы запустить этот код, сохраните его в файле server.js и выполните в терминале такую команду:
Для проверки сервера откройте какой-нибудь браузер и введите в адресной строке http://127.0.0.1:3000 , то есть — тот адрес сервера, который будет выведен в консоли после его успешного запуска. Если всё работает как надо — на странице будет выведено «Hello World».
Разберём этот пример.
Для начала, обратите внимание на то, что код содержит команду подключения модуля http.
Платформа Node.js является обладателем замечательного стандартного набора модулей, в который входят отлично проработанные механизмы для работы с сетью.
Метод createServer() объекта http создаёт новый HTTP-сервер и возвращает его.
Сервер настроен на прослушивание определённого порта на заданном хосте. Когда сервер будет готов, вызывается соответствующий коллбэк, сообщающий нам о том, что сервер работает.
Когда сервер получает запрос, вызывается событие request , предоставляющее два объекта. Первый — это запрос ( req , объект http.IncomingMessage), второй — ответ ( res , объект http.ServerResponse). Они представляют собой важнейшие механизмы обработки HTTP-запросов.
Первый предоставляет в наше распоряжение сведения о запросе. В нашем простом примере этими данными мы не пользуемся, но, при необходимости, с помощью объекта req можно получить доступ к заголовкам запроса и к переданным в нём данным.
Второй нужен для формирования и отправки ответа на запрос.
В данном случае ответ на запрос мы формируем следующим образом. Сначала устанавливаем свойство statusCode в значение 200 , что указывает на успешное выполнение операции:
Далее, мы устанавливаем заголовок Content-Type :
После этого мы завершаем подготовку ответа, добавляя его содержимое в качестве аргумента метода end() :
Мы уже говорили о том, что вокруг платформы Node.js сформировалась мощная экосистема. Обсудим теперь некоторые популярные фреймворки и вспомогательные инструменты для Node.js.
Фреймворки и вспомогательные инструменты для Node.js
Node.js — это низкоуровневая платформа. Для того чтобы упростить разработку для неё и облегчить жизнь программистам, было создано огромное количество библиотек. Некоторые из них со временем стали весьма популярными. Вот небольшой список библиотек, которые я считаю отлично сделанными и достойными изучения:
- Express. Эта библиотека предоставляет разработчику предельно простой, но мощный инструмент для создания веб-серверов. Ключом к успеху Express стал минималистический подход и ориентация на базовые серверные механизмы без попытки навязать некое видение «единственно правильной» серверной архитектуры.
- Meteor. Это — мощный фулстек-фреймворк, реализующий изоморфный подход к разработке приложений на JavaScript и к использованию кода и на клиенте, и на сервере. Когда-то Meteor представлял собой самостоятельный инструмент, включающий в себя всё, что только может понадобиться разработчику. Теперь он, кроме того, интегрирован с фронтенд-библиотеками, такими, как React, Vue и Angular. Meteor, помимо разработки обычных веб-приложений, можно использовать и в мобильной разработке.
- Koa. Этот веб-фреймворк создан той же командой, которая занимается работой над Express. При его разработке, в основу которой легли годы опыта работы над Express, внимание уделялось простоте решения и его компактности. Этот проект появился как решение задачи внесения в Express серьёзных изменений, несовместимых с другими механизмами фреймворка, которые могли бы расколоть сообщество.
- Next.js. Этот фреймворк предназначен для организации серверного рендеринга React-приложений.
- Micro. Это — весьма компактная библиотека для создания асинхронных HTTP-микросервисов.
- Socket.io. Это библиотека для разработки сетевых приложений реального времени.
На самом деле, в экосистеме Node.js можно найти вспомогательную библиотеку для решения практически любой задачи. Как вы понимаете, на строительство подобной экосистемы нужно немало времени. Платформа Node.js появилась в 2009 году. За время её существования случилось много всего такого, о чём стоит знать программисту, который хочет изучить эту платформу.
Краткая история Node.js
В этом году Node.js исполнилось уже 9 лет. Это, конечно, не так уж и много, если сравнить этот возраст с возрастом JavaScript, которому уже 23 года, или с 25-летним возрастом веба, существующем в таком виде, в котором мы его знаем, если считать от появления браузера Mosaic.
9 лет — это маленький срок для технологии, но сейчас возникает такое ощущение, что платформа Node.js существовала всегда.
Я начал работу с Node.js с ранних версий платформы, когда ей было ещё только 2 года. Даже тогда, несмотря на то, что информации о Node.js было не так уж и много, уже можно было почувствовать, что Node.js — это очень серьёзно.
Теперь поговорим о технологиях, лежащих в основе Node.js и кратко рассмотрим основные события, связанные с этой платформой.
Итак, JavaScript — это язык программирования, который был создан в Netscape как скриптовый язык, предназначенный для управления веб-страницами в браузере Netscape Navigator.
Источник