From daf597e23c265af5a2d4cd03500ee5fde41561b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=AE=D1=80=D1=8C=D0=B5?= =?UTF-8?q?=D0=B2=D0=B8=D1=87=20=D0=A2=D1=80=D0=BE=D0=B8=D1=86=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9?= Date: Wed, 17 Jul 2024 18:22:58 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BE=D0=B1=D0=B7=D0=BE=D1=80=20=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=20Deno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- people/dreamshaded/index.md | 6 ++ people/dreamshaded/photo.jpg | Bin 0 -> 87057 bytes tools/deno/index.11tydata.json | 4 + tools/deno/index.md | 181 +++++++++++++++++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 people/dreamshaded/index.md create mode 100644 people/dreamshaded/photo.jpg create mode 100644 tools/deno/index.11tydata.json create mode 100644 tools/deno/index.md diff --git a/people/dreamshaded/index.md b/people/dreamshaded/index.md new file mode 100644 index 0000000000..2a332206a6 --- /dev/null +++ b/people/dreamshaded/index.md @@ -0,0 +1,6 @@ +--- +name: 'Роман Троицкий' +url: https://github.com/DreamShaded +photo: 'photo.jpg' +--- +Влюблён во фронтенд. Один из организаторов [MoscowCSS митапа](https://t.me/moscowcss) diff --git a/people/dreamshaded/photo.jpg b/people/dreamshaded/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef98540052036535c64ebda736d36d89ea0d43c9 GIT binary patch literal 87057 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 Ke_A8$pa0pVFRV5I literal 0 HcmV?d00001 diff --git a/tools/deno/index.11tydata.json b/tools/deno/index.11tydata.json new file mode 100644 index 0000000000..b6e4e8b798 --- /dev/null +++ b/tools/deno/index.11tydata.json @@ -0,0 +1,4 @@ +{ + "updatedAt": "2024-07-13T18:44:00.719Z", + "createdAt": "2024-07-13T18:44:00.719Z" +} diff --git a/tools/deno/index.md b/tools/deno/index.md new file mode 100644 index 0000000000..971534e2cb --- /dev/null +++ b/tools/deno/index.md @@ -0,0 +1,181 @@ +--- +title: "Что такое Deno" +description: "Альтернатива NodeJS от создателя NodeJS." +authors: + - dreamshaded +# contributors: +keywords: + - deno + - js runtime + - альтернатива node js +related: + - tools/nodejs + - tools/nodejs-tooling + - tools/gateway +tags: + - article +--- + +## Кратко + +Deno - это современная среда выполнения JavaScript/TypeScript, созданная Райаном Далом, первоначальным создателем Node.js, в 2018 году. Она была разработана для решения ряда проблем и ограничений, присутствующих в Node.js, внедряя различные функции и архитектурные решения, направленные на улучшение безопасности, опыта разработчиков и производительности. + +## Ключевые отличия от NodeJS + +В первую очередь Райана смущала безопасность NodeJS: наличие неограниченного доступа к файловой системе, сети, переменным окружения создаёт значительный риск для безопасности в случае исполнения недоверенного кода. Так же у NodeJS нет механизмов для ограничения возможностей скриптов программно. В Deno же код выполняется в песочницах, требуя явных разрешений на доступы к файловой системе, сети и переменным окружения. Управлять доступами необходимо из командной строки. Так, например, для того, чтобы разрешить коду использовать сеть, мы должны запустить скрипт из терминала с флагами: + +```javascript +// my-script.js +const url = "https://api.github.com/users/denoland"; + +async function fetchData() { + try { + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`Request error! status: ${response.status}`); + } + + const data = await response.json(); + console.log('Data': data); + } catch (error) { + console.error("Error fetching data:", error); + } +} + +fetchData(); +``` + +```bash +deno run --allow-net my-script.js +``` + +А вот пример запуска скрипта с параметрами доступа к файловой системе: +```javascript +// my-other-script.js +const { readTextFile, writeTextFile } = Deno; + +async function modifyFileContent() { + try { + const inputFile = 'input.txt'; // путь до файла может быть абсолютным и относительным + const inputContent = await readTextFile(inputFile); + + console.log(`Read from ${inputFile}: ${inputContent}`); + + // Приведём строки к верхнему регистру: + const modifiedContent = inputContent.toUpperCase(); + const outputFile = 'output.txt'; + + await writeTextFile(outputFile, modifiedContent); + + console.log(`Written to ${outputFile}: ${modifiedContent}`); + } catch (error) { + console.error('Error with file operations:', error); + } +} + +modifyFileContent(); +``` + +```bash +deno run --allow-read --allow-write my-other-script.js +``` + +Если мы установим пакет, которому необходимы дополнительные права, то при попытке выполнения увидим запрос: + +```bash +deno run npm:file-access-package + ┌ Deno requests write access to /usr/bin/. + ├ Requested by `file-access-package` + ├ Run again with --allow-write to bypass this prompt. + └ Allow? [y/n] (y = yes, allow; n = no, deny) + +``` + +Вторая проблема - менеджмент зависимостей. В NodeJS библиотеки и фреймворки устанавливаются с помощью NPM, и большая часть пакетов имеет свои зависимости, что приводит к созданию графа зависимостей высокой вложенности, что, естественно, усложняет менеджмент зависимостей (привет, overrides) и увеличивает риски возникновения конфликтов версий. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество и Райан ещё не забыли [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). + +Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакев из registry.npmjs.org. + +Как это выглядит на практике: + +```javascript +// импорт из самой последней, самой свежей версии пакета std: +import { assertEquals } from "https://deno.land/std/testing/asserts.ts"; + +// импорт из конкретной версии пакета, в данном случае 0.104.0: +import { serve } from "https://deno.land/std@0.104.0/http/server.ts"; + +// импорт из приватного реестра с моего сервера: +import { SimpleButton } from "https://nexus.vzhyx.digital/deno-test/chamomile-ui@1.1.2/index.ts"; + +// импорт из NPM: +import React from "npm:react@18.2.0" +``` + +Следом Райан посчитал необходимым привести работу с модулями к стандарту. NodeJS, конечно, поддерживает ESModules, однако для этого необходимо указать "type": "module" в package.json или использовать файлы с расширением .mjs, оставляя работу с CommonJS с помощью require() поведением по умолчанию. Получается, код в Deno и в браузере выглядит консистентнее, чем в NodeJS. + + + +Таким же образом Райан поступил и с асинхронными операциями. NodeJS поддерживает промисы и async/await, однако значительная часть кор-фичей построена на колбэках, или получила асинхронный аналог, как, например, fs.readFile, который принимает в себя путь до файла и колбэк для обработки прочитанных данных, возвращая undefined, и fs.readFileSync, который принимает в себя путь до файла и возвращает его содержимое. Deno кор-фичи сразу спроектированы асинхронно, и разработчику теперь не нужно запоминать вариации решения одной и той же задачи, что также упрощает изучение апи. + + + +Ещё одно крупное нововведение - встроенный тулинг для работы с качеством кода. В NodeJS это отдано на откуп отдельным пакетам: ESLint, Prettier, Mocha, Jest и так далее, а Deno поставляет это всё "из коробки". Запустив утилиту lint командой deno lint мы получим список отклонений от кодстайла, а запустив утилиту fmt командой deno fmt мы получим отформатированный код. Бонусом deno избавляет нас от пачки конфигурационных файлов для линтеров, форматтеров и прочих утилит, всё настраивается в одном месте - deno.json: + +```json +{ + "imports": { + "std/": "https://deno.land/std@0.224.0/" + }, + "tasks": { + "dev": "deno run --watch main.ts" + }, + "lint": { + "include": ["src/"], + "exclude": ["src/testdata/", "src/fixtures/**/*.ts"], + "rules": { + "tags": ["recommended"], + "include": ["ban-untagged-todo"], + "exclude": ["no-unused-vars"] + } + }, + "fmt": { + "useTabs": true, + "lineWidth": 80, + "indentWidth": 4, + "semiColons": true, + "singleQuote": true, + "proseWrap": "preserve", + "include": ["src/"], + "exclude": ["src/testdata/", "src/fixtures/**/*.ts"] + } +} +``` + +Встроенный фреймворк для тестирования так же позволяет разобраться с одним фреймворком и продолжить изучение других API рантайма, а писать тесты на нём очень просто: + +```javascript +import { assertEquals } from "https://deno.land/std/testing/asserts.ts"; + +Deno.test("example test", () => { + const x = 1 + 2; + assertEquals(x, 3); +}); +``` + +И, конечно, в отличие от NodeJS, который поддерживает TypeScript только через установку и конфигурацию отдельных пакетов, Deno из коробки предоставляет компилятор ts, что позволяет нам писать на TypeScript без установки дополнительных пакетов. + +Последнее значительное отличие Deno от NodeJS - исходный код. NodeJS написан преимущественно на C|C++, а Deno - на Rust, на языке, известном более надёжной работой с памятью и мультипоточностью, а также даёт возможность расширять функциональность Deno с помощью плагинов, написанных на Rust. + +## Использование + +Deno поддерживают и используют достаточно много компаний: Slack, Netlify, SalesForce, Tencent, однако нет подробной информации о проектах и статистики использования. + +## Минусы + +Несмотря на то, что Deno позиционируется как следующий этап эволюции NodeJS, как переосмысление и исправление ошибок, Deno также не лишён и минусов: + +1. Экосистема. NodeJS развивается с 2009 года, и имеет более двух миллионов пакетов, в отличие от Deno. Также хоть Deno и внедрил поддержку npm пакетов, совместимость не полная и перенос существующего проекта с NodeJS на Deno может затребовать колоссального рефакторинга. +2. Поддержка в IDE. Несмотря на то, что у Deno имеются все средства обеспечения качества кода "из коробки", IDE и редакторы могут не поддерживать плагины или лишиться поддержки при обновлении версии Deno, и проблемы уже возникали. +3. TS в коробке. Поддержка TS напрямую кажется отличным решением, однако даёт дополнительную нагрузку при компиляции "на лету". Это может приводить к замедлению работы и увеличению потребления ресурсов сервера. +4. Стабильность, поддержка. Так как Deno всё ещё является новым рантаймом, развивается, меняет, добавляет и выводит API, он не может обеспечить такую же стабильность, как у NodeJS. Кроме того, политика долгосрочной поддержки (LTS) всё ещё в планах. From 1c69104a63e0c02ba373d3f5380c64ee71783c52 Mon Sep 17 00:00:00 2001 From: Polina Gurtovaia Date: Fri, 19 Jul 2024 22:45:24 +0400 Subject: [PATCH 2/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B1=D0=B5=D0=B9=D0=B4=D0=B6=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- people/dreamshaded/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/people/dreamshaded/index.md b/people/dreamshaded/index.md index 2a332206a6..633211561a 100644 --- a/people/dreamshaded/index.md +++ b/people/dreamshaded/index.md @@ -2,5 +2,7 @@ name: 'Роман Троицкий' url: https://github.com/DreamShaded photo: 'photo.jpg' +badges: + - first-contribution-small --- Влюблён во фронтенд. Один из организаторов [MoscowCSS митапа](https://t.me/moscowcss) From 1855bda157263c11b9cc99c8157161d448c937ab Mon Sep 17 00:00:00 2001 From: Roman Troitsky Date: Sun, 21 Jul 2024 22:13:12 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Polina Gurtovaia --- tools/deno/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deno/index.md b/tools/deno/index.md index 971534e2cb..b36823d6ea 100644 --- a/tools/deno/index.md +++ b/tools/deno/index.md @@ -18,7 +18,7 @@ tags: ## Кратко -Deno - это современная среда выполнения JavaScript/TypeScript, созданная Райаном Далом, первоначальным создателем Node.js, в 2018 году. Она была разработана для решения ряда проблем и ограничений, присутствующих в Node.js, внедряя различные функции и архитектурные решения, направленные на улучшение безопасности, опыта разработчиков и производительности. +Deno - это современная среда выполнения JavaScript/TypeScript, созданная Райаном Далом, первоначальным создателем Node.js, в 2018 году. Она была разработана для решения ряда проблем и ограничений, присутствующих в Node.js. Deno внедряет различные функции и архитектурные решения для улучшения безопасности, опыта разработчиков и производительности. ## Ключевые отличия от NodeJS From 566041f109e34e03f22d171d72373ae8c573d371 Mon Sep 17 00:00:00 2001 From: Roman Troitsky Date: Sun, 21 Jul 2024 22:13:34 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Polina Gurtovaia --- tools/deno/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deno/index.md b/tools/deno/index.md index b36823d6ea..4ff4773967 100644 --- a/tools/deno/index.md +++ b/tools/deno/index.md @@ -22,7 +22,7 @@ Deno - это современная среда выполнения JavaScript/ ## Ключевые отличия от NodeJS -В первую очередь Райана смущала безопасность NodeJS: наличие неограниченного доступа к файловой системе, сети, переменным окружения создаёт значительный риск для безопасности в случае исполнения недоверенного кода. Так же у NodeJS нет механизмов для ограничения возможностей скриптов программно. В Deno же код выполняется в песочницах, требуя явных разрешений на доступы к файловой системе, сети и переменным окружения. Управлять доступами необходимо из командной строки. Так, например, для того, чтобы разрешить коду использовать сеть, мы должны запустить скрипт из терминала с флагами: +В первую очередь Райана смущала безопасность. Node.js предоставляет неограниченные доступы к файловой системе, сети и переменным окружения. Это создаёт значительный риск для безопасности в случае исполнения недоверенного кода. Так же у Node.js нет механизмов для ограничения возможностей скриптов программно. В Deno же код выполняется в песочницах, требуя явных разрешений на доступы к файловой системе, сети и переменным окружения. Управлять доступами необходимо из командной строки. Так, например, для того, чтобы разрешить коду использовать сеть, мы должны запустить скрипт из терминала с флагами: ```javascript // my-script.js From 6dac95340aecc1aead014cfc03ce6fa1cbc67372 Mon Sep 17 00:00:00 2001 From: Roman Troitsky Date: Sun, 21 Jul 2024 22:32:10 +0300 Subject: [PATCH 5/8] Update tools/deno/index.md Co-authored-by: Polina Gurtovaia --- tools/deno/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deno/index.md b/tools/deno/index.md index 4ff4773967..7dcc843a82 100644 --- a/tools/deno/index.md +++ b/tools/deno/index.md @@ -94,7 +94,7 @@ deno run npm:file-access-package Вторая проблема - менеджмент зависимостей. В NodeJS библиотеки и фреймворки устанавливаются с помощью NPM, и большая часть пакетов имеет свои зависимости, что приводит к созданию графа зависимостей высокой вложенности, что, естественно, усложняет менеджмент зависимостей (привет, overrides) и увеличивает риски возникновения конфликтов версий. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество и Райан ещё не забыли [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). -Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакев из registry.npmjs.org. +Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакетов из registry.npmjs.org. Как это выглядит на практике: From 30493efde300c2f058a6d2099c9e1c7f42d42dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=AE=D1=80=D1=8C=D0=B5?= =?UTF-8?q?=D0=B2=D0=B8=D1=87=20=D0=A2=D1=80=D0=BE=D0=B8=D1=86=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9?= Date: Sun, 21 Jul 2024 22:34:02 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D0=B8=20=D0=BE=20?= =?UTF-8?q?Deno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/deno/index.md | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/tools/deno/index.md b/tools/deno/index.md index 7dcc843a82..545ec01231 100644 --- a/tools/deno/index.md +++ b/tools/deno/index.md @@ -1,6 +1,6 @@ --- title: "Что такое Deno" -description: "Альтернатива NodeJS от создателя NodeJS." +description: "Альтернатива Node.JS от создателя Node.JS." authors: - dreamshaded # contributors: @@ -9,8 +9,8 @@ keywords: - js runtime - альтернатива node js related: - - tools/nodejs - - tools/nodejs-tooling + - tools/Node.JS + - tools/Node.JS-tooling - tools/gateway tags: - article @@ -20,7 +20,7 @@ tags: Deno - это современная среда выполнения JavaScript/TypeScript, созданная Райаном Далом, первоначальным создателем Node.js, в 2018 году. Она была разработана для решения ряда проблем и ограничений, присутствующих в Node.js. Deno внедряет различные функции и архитектурные решения для улучшения безопасности, опыта разработчиков и производительности. -## Ключевые отличия от NodeJS +## Ключевые отличия от Node.JS В первую очередь Райана смущала безопасность. Node.js предоставляет неограниченные доступы к файловой системе, сети и переменным окружения. Это создаёт значительный риск для безопасности в случае исполнения недоверенного кода. Так же у Node.js нет механизмов для ограничения возможностей скриптов программно. В Deno же код выполняется в песочницах, требуя явных разрешений на доступы к файловой системе, сети и переменным окружения. Управлять доступами необходимо из командной строки. Так, например, для того, чтобы разрешить коду использовать сеть, мы должны запустить скрипт из терминала с флагами: @@ -81,7 +81,7 @@ modifyFileContent(); deno run --allow-read --allow-write my-other-script.js ``` -Если мы установим пакет, которому необходимы дополнительные права, то при попытке выполнения увидим запрос: +Если мы установим пакет, которому необходимы дополнительные права, то при попытке выполнения увидим, что для выполнения скрипта Deno необходимо разрешение на запись: ```bash deno run npm:file-access-package @@ -92,9 +92,9 @@ deno run npm:file-access-package ``` -Вторая проблема - менеджмент зависимостей. В NodeJS библиотеки и фреймворки устанавливаются с помощью NPM, и большая часть пакетов имеет свои зависимости, что приводит к созданию графа зависимостей высокой вложенности, что, естественно, усложняет менеджмент зависимостей (привет, overrides) и увеличивает риски возникновения конфликтов версий. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество и Райан ещё не забыли [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). +Вторая проблема - менеджмент зависимостей. В Node.JS библиотеки и фреймворки устанавливаются с помощью NPM, и большая часть пакетов имеет свои зависимости, что приводит к созданию графа зависимостей высокой вложенности, что, естественно, усложняет менеджмент зависимостей (привет, overrides) и увеличивает риски возникновения конфликтов версий. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество ещё не забыло [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). -Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакетов из registry.npmjs.org. +Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный ESM модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакетов из registry.npmjs.org. Как это выглядит на практике: @@ -112,15 +112,15 @@ import { SimpleButton } from "https://nexus.vzhyx.digital/deno-test/chamomile-ui import React from "npm:react@18.2.0" ``` -Следом Райан посчитал необходимым привести работу с модулями к стандарту. NodeJS, конечно, поддерживает ESModules, однако для этого необходимо указать "type": "module" в package.json или использовать файлы с расширением .mjs, оставляя работу с CommonJS с помощью require() поведением по умолчанию. Получается, код в Deno и в браузере выглядит консистентнее, чем в NodeJS. +Следом контрибьюторы посчитали необходимым привести работу с модулями к стандарту. Node.JS, конечно, поддерживает ESModules, однако для этого необходимо указать "type": "module" в package.json или использовать файлы с расширением .mjs, оставляя работу с CommonJS с помощью require() поведением по умолчанию. Получается, код в Deno и в браузере выглядит консистентнее, чем в Node.JS. -Таким же образом Райан поступил и с асинхронными операциями. NodeJS поддерживает промисы и async/await, однако значительная часть кор-фичей построена на колбэках, или получила асинхронный аналог, как, например, fs.readFile, который принимает в себя путь до файла и колбэк для обработки прочитанных данных, возвращая undefined, и fs.readFileSync, который принимает в себя путь до файла и возвращает его содержимое. Deno кор-фичи сразу спроектированы асинхронно, и разработчику теперь не нужно запоминать вариации решения одной и той же задачи, что также упрощает изучение апи. +Таким же образом Райан поступил и с асинхронными операциями. Node.JS поддерживает промисы и async/await, однако значительная часть кор-фичей построена на колбэках, или получила асинхронный аналог, как, например, fs.readFile, который принимает в себя путь до файла и колбэк для обработки прочитанных данных, возвращая undefined, и fs.readFileSync, который принимает в себя путь до файла и возвращает его содержимое. Deno кор-фичи сразу спроектированы асинхронно, и разработчику теперь не нужно запоминать вариации решения одной и той же задачи, что также упрощает изучение апи. -Ещё одно крупное нововведение - встроенный тулинг для работы с качеством кода. В NodeJS это отдано на откуп отдельным пакетам: ESLint, Prettier, Mocha, Jest и так далее, а Deno поставляет это всё "из коробки". Запустив утилиту lint командой deno lint мы получим список отклонений от кодстайла, а запустив утилиту fmt командой deno fmt мы получим отформатированный код. Бонусом deno избавляет нас от пачки конфигурационных файлов для линтеров, форматтеров и прочих утилит, всё настраивается в одном месте - deno.json: +Ещё одно крупное нововведение - встроенный тулинг для работы с качеством кода. В Node.JS это отдано на откуп отдельным пакетам: ESLint, Prettier, Mocha, Jest и так далее, а Deno поставляет это всё "из коробки". Запустив утилиту lint командой deno lint мы получим список отклонений от кодстайла, а запустив утилиту fmt командой deno fmt мы получим отформатированный код. Бонусом deno избавляет нас от пачки конфигурационных файлов для линтеров, форматтеров и прочих утилит, всё настраивается в одном месте - deno.json: ```json { @@ -152,20 +152,9 @@ import React from "npm:react@18.2.0" } ``` -Встроенный фреймворк для тестирования так же позволяет разобраться с одним фреймворком и продолжить изучение других API рантайма, а писать тесты на нём очень просто: +И, конечно, в отличие от Node.JS, который поддерживает TypeScript только через установку и конфигурацию отдельных пакетов, Deno из коробки предоставляет компилятор ts, что позволяет нам писать на TypeScript без установки дополнительных пакетов. -```javascript -import { assertEquals } from "https://deno.land/std/testing/asserts.ts"; - -Deno.test("example test", () => { - const x = 1 + 2; - assertEquals(x, 3); -}); -``` - -И, конечно, в отличие от NodeJS, который поддерживает TypeScript только через установку и конфигурацию отдельных пакетов, Deno из коробки предоставляет компилятор ts, что позволяет нам писать на TypeScript без установки дополнительных пакетов. - -Последнее значительное отличие Deno от NodeJS - исходный код. NodeJS написан преимущественно на C|C++, а Deno - на Rust, на языке, известном более надёжной работой с памятью и мультипоточностью, а также даёт возможность расширять функциональность Deno с помощью плагинов, написанных на Rust. +Последнее значительное отличие Deno от Node.JS - исходный код. Node.JS написан преимущественно на C|C++, а Deno - на Rust, на языке, известном более надёжной работой с памятью и мультипоточностью, а также даёт возможность расширять функциональность Deno с помощью плагинов, написанных на Rust. ## Использование @@ -173,9 +162,9 @@ Deno поддерживают и используют достаточно мн ## Минусы -Несмотря на то, что Deno позиционируется как следующий этап эволюции NodeJS, как переосмысление и исправление ошибок, Deno также не лишён и минусов: +Несмотря на то, что Deno позиционируется как следующий этап эволюции Node.JS, как переосмысление и исправление ошибок, Deno также не лишён и минусов: -1. Экосистема. NodeJS развивается с 2009 года, и имеет более двух миллионов пакетов, в отличие от Deno. Также хоть Deno и внедрил поддержку npm пакетов, совместимость не полная и перенос существующего проекта с NodeJS на Deno может затребовать колоссального рефакторинга. +1. Экосистема. Node.JS развивается с 2009 года, и имеет более двух миллионов пакетов, в отличие от Deno. Также хоть Deno и внедрил поддержку npm пакетов, совместимость не полная и перенос существующего проекта с Node.JS на Deno может затребовать колоссального рефакторинга. 2. Поддержка в IDE. Несмотря на то, что у Deno имеются все средства обеспечения качества кода "из коробки", IDE и редакторы могут не поддерживать плагины или лишиться поддержки при обновлении версии Deno, и проблемы уже возникали. 3. TS в коробке. Поддержка TS напрямую кажется отличным решением, однако даёт дополнительную нагрузку при компиляции "на лету". Это может приводить к замедлению работы и увеличению потребления ресурсов сервера. -4. Стабильность, поддержка. Так как Deno всё ещё является новым рантаймом, развивается, меняет, добавляет и выводит API, он не может обеспечить такую же стабильность, как у NodeJS. Кроме того, политика долгосрочной поддержки (LTS) всё ещё в планах. +4. Стабильность, поддержка. Так как Deno всё ещё является новым рантаймом, развивается, меняет, добавляет и выводит API, он не может обеспечить такую же стабильность, как у Node.JS. Кроме того, политика долгосрочной поддержки (LTS) всё ещё в планах. From 7fdf29acd38b1c7de638f7e64bbbb22db73bbaec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=AE=D1=80=D1=8C=D0=B5?= =?UTF-8?q?=D0=B2=D0=B8=D1=87=20=D0=A2=D1=80=D0=BE=D0=B8=D1=86=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9?= Date: Thu, 1 Aug 2024 05:41:00 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D0=B8=20=D0=BE=20?= =?UTF-8?q?Deno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/deno/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/deno/index.md b/tools/deno/index.md index 545ec01231..e8dbb91849 100644 --- a/tools/deno/index.md +++ b/tools/deno/index.md @@ -92,7 +92,7 @@ deno run npm:file-access-package ``` -Вторая проблема - менеджмент зависимостей. В Node.JS библиотеки и фреймворки устанавливаются с помощью NPM, и большая часть пакетов имеет свои зависимости, что приводит к созданию графа зависимостей высокой вложенности, что, естественно, усложняет менеджмент зависимостей (привет, overrides) и увеличивает риски возникновения конфликтов версий. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество ещё не забыло [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). +Вторая проблема - управление зависимостями. В NodeJS библиотеки и фреймворки устанавливаются с помощью NPM (Node Package Manager). Это означает, что каждый раз, когда вы добавляете новую библиотеку, она может иметь свои собственные зависимости. Например, если вы установите библиотеку "A", она может зависеть от библиотек "B" и "C", а те, в свою очередь, могут иметь свои зависимости. Это создает очень сложную структуру, похожую на дерево, где одна библиотека зависит от другой и так далее. Это усложняет управление зависимостями, потому что нужно следить за множеством версий разных библиотек. Если одна библиотека требует одну версию зависимости, а другая - другую, может возникнуть конфликт версий, и программа может перестать работать. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество ещё не забыло [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный ESM модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакетов из registry.npmjs.org. From dc9008da6b9b157911f681f9931fc12e154a738a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=AE=D1=80=D1=8C=D0=B5?= =?UTF-8?q?=D0=B2=D0=B8=D1=87=20=D0=A2=D1=80=D0=BE=D0=B8=D1=86=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9?= Date: Thu, 1 Aug 2024 20:18:54 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D0=B8=20=D0=BE=20?= =?UTF-8?q?Deno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/deno/index.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/deno/index.md b/tools/deno/index.md index e8dbb91849..5b7ffa1343 100644 --- a/tools/deno/index.md +++ b/tools/deno/index.md @@ -1,6 +1,6 @@ --- title: "Что такое Deno" -description: "Альтернатива Node.JS от создателя Node.JS." +description: "Альтернатива Node.js от создателя Node.js." authors: - dreamshaded # contributors: @@ -9,8 +9,8 @@ keywords: - js runtime - альтернатива node js related: - - tools/Node.JS - - tools/Node.JS-tooling + - tools/Node.js + - tools/Node.js-tooling - tools/gateway tags: - article @@ -20,7 +20,7 @@ tags: Deno - это современная среда выполнения JavaScript/TypeScript, созданная Райаном Далом, первоначальным создателем Node.js, в 2018 году. Она была разработана для решения ряда проблем и ограничений, присутствующих в Node.js. Deno внедряет различные функции и архитектурные решения для улучшения безопасности, опыта разработчиков и производительности. -## Ключевые отличия от Node.JS +## Ключевые отличия от Node.js В первую очередь Райана смущала безопасность. Node.js предоставляет неограниченные доступы к файловой системе, сети и переменным окружения. Это создаёт значительный риск для безопасности в случае исполнения недоверенного кода. Так же у Node.js нет механизмов для ограничения возможностей скриптов программно. В Deno же код выполняется в песочницах, требуя явных разрешений на доступы к файловой системе, сети и переменным окружения. Управлять доступами необходимо из командной строки. Так, например, для того, чтобы разрешить коду использовать сеть, мы должны запустить скрипт из терминала с флагами: @@ -92,7 +92,7 @@ deno run npm:file-access-package ``` -Вторая проблема - управление зависимостями. В NodeJS библиотеки и фреймворки устанавливаются с помощью NPM (Node Package Manager). Это означает, что каждый раз, когда вы добавляете новую библиотеку, она может иметь свои собственные зависимости. Например, если вы установите библиотеку "A", она может зависеть от библиотек "B" и "C", а те, в свою очередь, могут иметь свои зависимости. Это создает очень сложную структуру, похожую на дерево, где одна библиотека зависит от другой и так далее. Это усложняет управление зависимостями, потому что нужно следить за множеством версий разных библиотек. Если одна библиотека требует одну версию зависимости, а другая - другую, может возникнуть конфликт версий, и программа может перестать работать. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество ещё не забыло [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). +Вторая проблема - управление зависимостями. В Node.js библиотеки и фреймворки устанавливаются с помощью NPM (Node Package Manager). Это означает, что каждый раз, когда вы добавляете новую библиотеку, она может иметь свои собственные зависимости. Например, если вы установите библиотеку "A", она может зависеть от библиотек "B" и "C", а те, в свою очередь, могут иметь свои зависимости. Это создает очень сложную структуру, похожую на дерево, где одна библиотека зависит от другой и так далее. Это усложняет управление зависимостями, потому что нужно следить за множеством версий разных библиотек. Если одна библиотека требует одну версию зависимости, а другая - другую, может возникнуть конфликт версий, и программа может перестать работать. Ещё централизация реестра зависимостей немного осложняет мененджмент пакетов из разных реестров: необходимо указать список реестров в .npmrc, авторизоваться или прописать явно токены авторизации и так далее. Кроме того, сообщество ещё не забыло [инцидент с left-pad](https://en.wikipedia.org/wiki/Npm_left-pad_incident). Deno вместо этого предлагает механизм импорта по URL с локальным кешированием, что приводит к созданию плоской структуры зависимостей. Каждый URL рассматривается как отдельный, уникальный ESM модуль, что убирает возможность возникновения конфликтов версий начисто, а так же для доступов в различные реестры можно обойтись наличием VPN, т.к. в реестре теперь лежит статический JS или TS файл, а не .tar.gz архив. Однако децентрализация всё ещё оставляет возможности повторения ситуации с left-pad, особенно при использовании открытых, а не приватных репозиториев. Также в релизе 1.28 была добавлена возможность использования npm пакетов из registry.npmjs.org. @@ -112,15 +112,15 @@ import { SimpleButton } from "https://nexus.vzhyx.digital/deno-test/chamomile-ui import React from "npm:react@18.2.0" ``` -Следом контрибьюторы посчитали необходимым привести работу с модулями к стандарту. Node.JS, конечно, поддерживает ESModules, однако для этого необходимо указать "type": "module" в package.json или использовать файлы с расширением .mjs, оставляя работу с CommonJS с помощью require() поведением по умолчанию. Получается, код в Deno и в браузере выглядит консистентнее, чем в Node.JS. +Следом контрибьюторы посчитали необходимым привести работу с модулями к стандарту. Node.js, конечно, поддерживает ESModules, однако для этого необходимо указать "type": "module" в package.json или использовать файлы с расширением .mjs, оставляя работу с CommonJS с помощью require() поведением по умолчанию. Получается, код в Deno и в браузере выглядит консистентнее, чем в Node.js. -Таким же образом Райан поступил и с асинхронными операциями. Node.JS поддерживает промисы и async/await, однако значительная часть кор-фичей построена на колбэках, или получила асинхронный аналог, как, например, fs.readFile, который принимает в себя путь до файла и колбэк для обработки прочитанных данных, возвращая undefined, и fs.readFileSync, который принимает в себя путь до файла и возвращает его содержимое. Deno кор-фичи сразу спроектированы асинхронно, и разработчику теперь не нужно запоминать вариации решения одной и той же задачи, что также упрощает изучение апи. +Таким же образом Райан поступил и с асинхронными операциями. Node.js поддерживает промисы и async/await, однако значительная часть кор-фичей построена на колбэках, или получила асинхронный аналог, как, например, fs.readFile, который принимает в себя путь до файла и колбэк для обработки прочитанных данных, возвращая undefined, и fs.readFileSync, который принимает в себя путь до файла и возвращает его содержимое. Deno кор-фичи сразу спроектированы асинхронно, и разработчику теперь не нужно запоминать вариации решения одной и той же задачи, что также упрощает изучение апи. -Ещё одно крупное нововведение - встроенный тулинг для работы с качеством кода. В Node.JS это отдано на откуп отдельным пакетам: ESLint, Prettier, Mocha, Jest и так далее, а Deno поставляет это всё "из коробки". Запустив утилиту lint командой deno lint мы получим список отклонений от кодстайла, а запустив утилиту fmt командой deno fmt мы получим отформатированный код. Бонусом deno избавляет нас от пачки конфигурационных файлов для линтеров, форматтеров и прочих утилит, всё настраивается в одном месте - deno.json: +Ещё одно крупное нововведение - встроенный тулинг для работы с качеством кода. В Node.js это отдано на откуп отдельным пакетам: ESLint, Prettier, Mocha, Jest и так далее, а Deno поставляет это всё "из коробки". Запустив утилиту lint командой deno lint мы получим список отклонений от кодстайла, а запустив утилиту fmt командой deno fmt мы получим отформатированный код. Бонусом deno избавляет нас от пачки конфигурационных файлов для линтеров, форматтеров и прочих утилит, всё настраивается в одном месте - deno.json: ```json { @@ -152,9 +152,9 @@ import React from "npm:react@18.2.0" } ``` -И, конечно, в отличие от Node.JS, который поддерживает TypeScript только через установку и конфигурацию отдельных пакетов, Deno из коробки предоставляет компилятор ts, что позволяет нам писать на TypeScript без установки дополнительных пакетов. +И, конечно, в отличие от Node.js, который поддерживает TypeScript только через установку и конфигурацию отдельных пакетов, Deno из коробки предоставляет компилятор ts, что позволяет нам писать на TypeScript без установки дополнительных пакетов. -Последнее значительное отличие Deno от Node.JS - исходный код. Node.JS написан преимущественно на C|C++, а Deno - на Rust, на языке, известном более надёжной работой с памятью и мультипоточностью, а также даёт возможность расширять функциональность Deno с помощью плагинов, написанных на Rust. +Последнее значительное отличие Deno от Node.js - исходный код. Node.js написан преимущественно на C|C++, а Deno - на Rust, на языке, известном более надёжной работой с памятью и мультипоточностью, а также даёт возможность расширять функциональность Deno с помощью плагинов, написанных на Rust. ## Использование @@ -162,9 +162,9 @@ Deno поддерживают и используют достаточно мн ## Минусы -Несмотря на то, что Deno позиционируется как следующий этап эволюции Node.JS, как переосмысление и исправление ошибок, Deno также не лишён и минусов: +Несмотря на то, что Deno позиционируется как следующий этап эволюции Node.js, как переосмысление и исправление ошибок, Deno также не лишён и минусов: -1. Экосистема. Node.JS развивается с 2009 года, и имеет более двух миллионов пакетов, в отличие от Deno. Также хоть Deno и внедрил поддержку npm пакетов, совместимость не полная и перенос существующего проекта с Node.JS на Deno может затребовать колоссального рефакторинга. +1. Экосистема. Node.js развивается с 2009 года, и имеет более двух миллионов пакетов, в отличие от Deno. Также хоть Deno и внедрил поддержку npm пакетов, совместимость не полная и перенос существующего проекта с Node.js на Deno может затребовать колоссального рефакторинга. 2. Поддержка в IDE. Несмотря на то, что у Deno имеются все средства обеспечения качества кода "из коробки", IDE и редакторы могут не поддерживать плагины или лишиться поддержки при обновлении версии Deno, и проблемы уже возникали. 3. TS в коробке. Поддержка TS напрямую кажется отличным решением, однако даёт дополнительную нагрузку при компиляции "на лету". Это может приводить к замедлению работы и увеличению потребления ресурсов сервера. -4. Стабильность, поддержка. Так как Deno всё ещё является новым рантаймом, развивается, меняет, добавляет и выводит API, он не может обеспечить такую же стабильность, как у Node.JS. Кроме того, политика долгосрочной поддержки (LTS) всё ещё в планах. +4. Стабильность, поддержка. Так как Deno всё ещё является новым рантаймом, развивается, меняет, добавляет и выводит API, он не может обеспечить такую же стабильность, как у Node.js. Кроме того, политика долгосрочной поддержки (LTS) всё ещё в планах.