Объявление о встроенной поддержке npm в Deno Deploy

(Первоначально опубликовано на deno.com/blog.)

Deno Deploy упрощает создание и размещение любого приложения JavaScript, функции или сервера API. Программирование становится быстрее и проще благодаря простым и надежным API-интерфейсам Deno — веб-стандартным API, встроенным модулям Node.js и основным облачным сервисам, превращенным в первоклассные API-интерфейсы JavaScript, такие как Deno KV (сейчас в открытой бета-версии). »). Ваши приложения работают рядом с вашими пользователями в 35 регионах мира, обеспечивая минимальную задержку и высокую доступность.

Сегодня мы рады сообщить, что Deno Deploy теперь встроенно поддерживает запуск модулей npm через спецификаторы npm:. Это означает, что теперь вы можете размещать приложения Node.js на периферии, используя модули npm, без необходимости выполнения этапов сборки.

Вот пример запуска приложения Express в Deno Deploy:

// Import express and instantiate it
import express from "npm:express@4";
const app = express();

// Register a route
app.get("/", (req, res) => {
  res.send("Hello World!");
});

// Run the server!
app.listen(3000);

Попробуйте сами на детской площадке →

Deno Deploy — это первая изолированная бессерверная платформа, которая изначально поддерживает встроенные модули Node.js и модули npm. Это открывает дверь в совершенно новый мир возможностей для разработчиков JavaScript — теперь даже ваши приложения Node.js могут размещаться глобально с минимальной задержкой, высокой доступностью и мгновенным развертыванием.

Импорт и использование более 2 миллионов модулей npm легко интегрируются с остальной частью Deno: первоклассная поддержка TypeScript, встроенные инструменты, такие как форматтер, линтер и средство запуска тестов, а также языковой сервер Deno, который обеспечивает богатый опыт редактирования в вашей IDE.

Никакого шага пакета не требуется

Поддержка NPM и Node в Deno является встроенной — транспиляция, этап сборки или внедрение полифилов не выполняются. Deno Deploy изначально понимает API Node.js и знает, как загружать и выполнять модули NPM.

Это дает вам два основных преимущества: лучший опыт разработки и лучшая совместимость.

Мы гордимся короткой обратной связью и мгновенным развертыванием Deno Deploy. Это распространяется и на поддержку npm. Вы можете разрабатывать локально, используя спецификаторы npm:, и развертывать их в Deno Deploy посредством нашей бесшовной интеграции с GitHub, переходя от git push к работающему сайту за считанные секунды.

Поскольку мы не транспилируем, не объединяем и не полифилируем ваш код или любые импортируемые вами модули npm, подобных шагов, которые могли бы вызвать проблемы, не существует. Это означает, что код, работающий локально, будет работать и в Deno Deploy, и наоборот.

Поскольку нет объединения или сопоставления исходного кода, если что-то пойдет не так, трассировки и журналы стека Deno Deploy показывают имена файлов и номера строк, которые совпадают с тем, что вы видите локально — больше не нужно копаться в непонятном минимизированном и связанном коде.

Примеры и варианты использования

Вот несколько примеров того, что вы можете создать с помощью пакетов npm в Deno Deploy.

Фиксировать

Fastify — популярное решение для создания API-серверов и веб-приложений на Node.js. Благодаря поддержке спецификатора npm в Deno Deploy его теперь можно использовать и в ваших веб-приложениях, работающих на периферии.

Попробуйте сами на детской площадке →

// Import the framework and instantiate it
import Fastify from "npm:fastify@4";
const fastify = Fastify();

// Declare a route
fastify.get("/", async function handler(request, reply) {
  return "Hello World!";
});

// Run the server!
await fastify.listen({ hostname: "localhost", port: 3000 });

Deno.serve + OpenAI

Поддержка NPM не ограничивается веб-фреймворками. Вы можете использовать его для запуска любого существующего приложения Deno, импортировав пакеты из NPM. Например, вы можете использовать OpenAI SDK, чтобы улучшить свое приложение с помощью самых современных дополнений ИИ.

Попробуйте сами на детской площадке →

import OpenAI from "npm:openai@4";

const openai = new OpenAI({ apiKey: Deno.env.get("OPENAI_API_KEY") });
Deno.serve(async (req: Request) => {
  const completion = await openai.chat.completions.create({
    model: "gpt-3.5-turbo",
    messages: [{ role: "user", content: "Tell me a programmer joke" }],
  });
  const joke = completion.choices[0].message.content;
  return new Response(joke);
});

Крипто API

Шифрование и дешифрование — одна из самых популярных категорий модулей в npm. Вот пример использования crypto-js, одного из лучших пакетов на npm.

Попробуйте сами на детской площадке →

import CryptoJS from "npm:crypto-js@4";

Deno.serve((_req: Request) => {
  // Encrypt
  const ciphertext = CryptoJS.AES.encrypt("my message", "secret key 123")
    .toString();
  // Decrypt
  const bytes = CryptoJS.AES.decrypt(ciphertext, "secret key 123");
  const originalText = bytes.toString(CryptoJS.enc.Utf8);
  return new Response(originalText);
});

Совместимость

Deno Deploy поддерживает все 47 встроенных модулей Node.js, таких как fs, path и http. Вы можете импортировать их напрямую через спецификатор node:, как в Node.js.

Любой пакет npm, использующий эти API, будет работать с Deno Deploy. Например, пакет aws-sdk, который внутри использует http, просто работает:

Попробуйте сами на детской площадке →

/** @jsx jsx */
/** @jsxFrag Fragment */
import { Hono } from "https://deno.land/x/[email protected]/mod.ts";
import { Fragment, jsx } from "https://deno.land/x/[email protected]/middleware.ts";
import { DynamoDBClient } from "npm:@aws-sdk/client-dynamodb@3";
import {
  DynamoDBDocumentClient,
  ExecuteStatementCommand,
} from "npm:@aws-sdk/lib-dynamodb";
import { fromEnv } from "npm:@aws-sdk/credential-providers@3";

// Init DynamoDB client
const client = new DynamoDBClient({
  region: "us-east-2",
  credentials: fromEnv(),
});
const docClient = DynamoDBDocumentClient.from(client);
// Init Hono app
const app = new Hono();
// List TODOs
app.get("/", async (c) => {
  const command = new ExecuteStatementCommand({
    Statement: "SELECT * FROM Todos WHERE complete = ?",
    Parameters: [false],
    ConsistentRead: true,
  });
  const response = await docClient.send(command);
  console.log(response);
  return c.html(
    <html>
      <body style={{ margin: "10px auto", maxWidth: "400px" }}>
        <h1>TODOs</h1>
        <form action="/" method="POST">
          <input type="text" name="text" />
          <button
            type="submit"
            style={{
              display: "inline-block",
              marginLeft: "5px",
            }}
          >
            Add Item
          </button>
        </form>
        {response.Items.map((item) => {
          return (
            <div style={{ margin: "5px 0" }}>
              {item.text}
            </div>
          );
        })}
      </body>
    </html>,
  );
});
// Add a TODO item
app.post("/", async (c) => {
  const body = await c.req.parseBody();
  const command = new ExecuteStatementCommand({
    Statement: `INSERT INTO Todos value {'text':?, 'complete':?}`,
    Parameters: [body.text, false],
  });
  try {
    const response = await docClient.send(command);
    console.log(response);
  } catch (e) {
    console.error(e);
  }
  return c.redirect("/");
});
Deno.serve(app.fetch);

Хотя наша совместимость с Node.js на данный момент очень хороша, все еще существуют некоторые API-интерфейсы Node.js, которые не поддерживаются или еще не полностью совместимы с реализацией Node.js.

Есть также некоторые пакеты npm, которые не будут работать в Deno Deploy. Любые пакеты, использующие NodeAPI (родной уровень плагинов для Node), не будут работать с бессерверной системой, такой как Deno Deploy, из-за ограничений песочницы. Та же изолированная программная среда безопасности также препятствует работе некоторых API Node.js, таких как child_process и vm.

Если у вас возникнут какие-либо проблемы при использовании определенного модуля npm в Deno Deploy, пожалуйста, откройте проблему здесь.

Что дальше

Благодаря поддержке npm и Deno KV в открытой бета-версии ваше приложение JavaScript может получить доступ к более чем двум миллионам модулей и раскрыть больше функций, обеспечить продуктивный и интуитивно понятный опыт разработки (например, подключение к глобально распределенной базе данных с помощью одной строки кода) и предложите быстрый процесс глобального развертывания, который напрямую вписывается в ваш рабочий процесс git. И все это, предлагая конечным пользователям минимальную задержку и высокую доступность.

Мы прилагаем все усилия, чтобы добавить важные полезные функции для дальнейшего упрощения создания и размещения сложных, готовых к использованию приложений. У нас впереди много интересных объявлений, так что следите за обновлениями!

Не пропустите ни одного обновления! Следите за нашим Twitter, присоединяйтесь к нашему Discord и подписывайтесь на наш канал YouTube.