Объявление о встроенной поддержке 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.