В 2018 году я написал статью вскоре после выпуска Deno, Deno — это не новое поколение Node.js! », недавно было какое-то исследование, давайте посмотрим на Deno в 2021 году.
Несомненно, Deno изменила представление об управлении пакетами. Deno сам по себе достаточно мал и стоимость проб и ошибок невелика, это действительно лидирует в тренде. Хотя это улучшение не новое, реакция действительно хорошая, вероятно, потому, что люди в мире давно страдают от NPM (шутки NPM: вы боитесь), использование простое, эффективное и даже получило много думаю о CDN для модулей JavaScript.
Далее давайте посмотрим на это вместе.
источник
мы сделалиimoveПроект iMove с открытым исходным кодом представляет собой логически повторно используемую, функционально-ориентированную библиотеку инструментов JavaScript для визуализации процессов.
Функции, поддерживаемые в настоящее время
- : Простота в использовании, простота рисования, более интуитивно понятное логическое выражение, простота понимания.
- : узел iMove поддерживает мультиплексирование, а отдельный узел поддерживает настройку параметров.
- : нужно написать только одну функцию, узел расширяемый и поддерживает интеграцию с плагинами.
- : Нет языковых ограничений для компиляции и вывода кода (например, поддерживаются компиляция и вывод JavaScript, Java)
По сути, грубо говоря, это использование набора геймплея или конфигурации операции для разработки. Каждый узел представляет собой функциональный, визуальный, настраиваемый, собираемый и экспортируемый код, который очень ограничен. Опираясь на графику х6 и протокол json можно сказать, что максимальный эффект получается при минимальных вложениях, с точки зрения позиционирования это достаточно точно. Мы используем его в своем бизнесе, и опыт и эффект тоже очень хорошие.
Недавно, чтобы открыть исходный код, небольшой партнер предложил 2 точки оптимизации:
- Дважды щелкните график, чтобы отредактировать функцию, которая более удобна в работе. уже сделано.
- Сделайте узел или процесс доступным для тестирования на этом интерфейсе. Эта проблема действительно существует: если узел измерим, функция будет более практичной.
Во-вторых, я с этим полностью согласен. Но вопрос в том, как этого добиться?
Код каждой ноды эквивалентен js-файлу, поэтому вам не нужно беспокоиться о загрязнении имен глобальных переменных, вы даже можете импортировать существующие пакеты NPM, но в конце вы должны экспортировать функцию. Следует отметить, что поскольку iMove по своей сути поддерживает асинхронный вызов кода узла, экспортируемая функция по умолчанию является обещанием.
Например, возьмите是否登录
Возьмем этот узел ответвления в качестве примера, давайте посмотрим, как написать код узла:
import fetch from 'node-fetch';
export default async function (ctx) {
return fetch('/api/isLogin')
.then(res => res.json())
.then(res => {
const {success, data: {isLogin} = {}} = res;
return success && isLogin;
}).catch(err => {
console.log('fetch /api/isLogin failed, the err is:', err);
return false;
});
}
по расширению
- Это ESM, основанный на основном написании модуля es.
- Поддержка внешнего импорта пакетов, иначе сложно справиться со сложными сценариями.
Подобные jsbin, codepen или codeandbox можно реализовать с помощью автономного плагина webpack или с помощью webide для инициализации и установки модулей, но это не очень хороший способ. imove совместим с браузерами и узлами. Он может работать напрямую без необходимости локальной установки пакетов NPM. Он также может отлично работать в узле. Это заставляет нас думать в направлении http-импорта. System.js — отличный выбор.
import-http
Если вы перейдете к документации по внешнему коду Deno link (d о нет. Слишком ленив для /manual/Lincoln…), он делает это, позволяя среде выполнения Deno загружать импорты и кэшировать их на диске с помощью параметра --allow-net.
На самом деле это просто кешируется в системном каталоге, таком как $HOME/Library/Caches/Deno на Mac. На самом деле существенного улучшения нет.
Очень здорово обращаться к коду по кодовому адресу.
No more node_modules bloat, no dependency to install.
В мире узлов кто-то также реализовал аналогичный механизм, а именноGitHub.com/egoist/IM PO…. Он обрабатывается во время компиляции через webpack/rollup.
см. конкретное использование
Сначала настройте webpack.config.js:
const ImportHttpWebpackPlugin = require('import-http/webpack')
module.exports = {
plugins: [new ImportHttpWebpackPlugin()]
}
Затем вы можете использовать его прямо в коде:
import React from 'https://unpkg.com/react'
import Vue from 'https://unpkg.com/vue'
console.log(React, Vue)
Принцип: разрешить import-http-resolver через компилятор webpack.resolverFactory.hooks.resolver, то есть импортировать по http и https. Затем загруженный контент кэшируется через fileModuleCache и httpCache.
На самом деле в Node.js это тоже очень просто сделать. покаGitHub.com/node будет /node…В каталоге можно решить загрузку и кэширование. Тем не менее, историческое бремя слишком велико, и еще предстоит пройти путь, чтобы добиться отсутствия импорта файловой системы любого рода из источников https. Тем не менее, это также хороший момент для всех, кто может участвовать в создании исходного кода Node.js.
- модуль: загрузчики ESM следующий планGitHub.com/node будет /node…
- официальная рабочая группаGitHub.com/node будет/magic…
Скоро появится поддержка стороннего загрузчика ESM, давайте подождем и посмотрим, использование похоже на следующее
node-dev --experimental-loader ts-node/ESM/transpile-only ./index.ts
esm.run
За границей также есть сервис ESM.run, позиционирующийся как «Новая эра CDN для модулей JavaScript». Это довольно просто, это новый способ переопределить хостинг модулей JavaScript на основе CDN.
Его схема.
Используйте NPM и github в качестве источников, синхронизируйтесь с Amazon s3, а затем используйте прокси для различных CDN для предоставления услуг пользователям.
CJS to ESM
Уже давно существует инструмент CJS to ESM. НапримерGitHub.com/standard-days после…, реализовывать большое количество полифилов самостоятельно, переходное состояние, пробовать и рано или поздно возвращаться к ядру.
The brilliantly simple, babel-less, bundle-less ECMAScript module loader.
// Set options as a parameter, environment variable, or rc file.
require = require("ESM")(module/*, options*/)
module.exports = require("./main.js")
Это локальная практика. Если это становится импортом по http, это не нужно делать локально. Лучше передать это службам, таким как cdn. Фактически, pika.dev/skypack.dev/jspm.io уже делает это.
с помощьюjspm.io(или другой аналогичный сервис) для преобразования commonjs в совместимый формат ESM.
import cheerio from "https://dev.jspm.io/NPM:cheerio/index.js";
В дополнение, 2 вопроса.
- В Китае нет аналогичного сервиса, раз есть cNPM, то будет ли аналогичный сервис? Думаю, кто-нибудь это сделает.
- Традиционные производители CDN также будут двигаться в этом направлении на следующем этапе либо путем приобретения, либо самостоятельного создания. Это на самом деле хороший бизнес. С одной стороны, он отвечает требованиям разработчиков, а с другой стороны, он также может предоставлять дополнительные услуги для традиционных производителей CDN. Это также часть новой инфраструктуры.
Суммировать
Deno — хорошее нововведение.Упомянутые выше службы import-http, esm.run или преобразования модулей можно назвать результатом косвенных или прямых результатов исследования Deno.
Но если вы хотите заменить Node, этих текущих функций и улучшений производительности недостаточно, чтобы заменить Node. Сообщество Node шло в ногу со временем после принятия функции es после Node 4, и обработка CJS и ESM также была очень своевременной. Итак, теперь, когда настало время, будет ли узел использовать HTTP-импорт сегодня?