@basenative/notify

中文文档
3.0.0发布于 2026/10/31Apache-2.0TypeScriptES Module构建来源已验证

Email notifications via SMTP and SendGrid with template rendering

原始使用文档
文档目录8 节
  1. Install
  2. Quick Start
  3. In-App Notifications
  4. API
  5. Email
  6. Transports
  7. In-App Notifications
  8. License

@basenative/notify

Email sending with HTML templates, in-app notifications, and SMTP/SendGrid/Resend transports

Part of the BaseNative ecosystem — a signal-based web runtime over native HTML.

Install

npm install @basenative/notify

Quick Start

import {
  renderEmail,
  createEmailSender,
  createSmtpTransport,
} from '@basenative/notify';

const transport = createSmtpTransport({
  host: 'smtp.example.com',
  port: 587,
  auth: { user: '[email protected]', pass: process.env.SMTP_PASS },
});

const sender = createEmailSender(transport);

const template = `
  <h1>Hello, {{ name }}!</h1>
  <p>Your account has been created. <a href="{{ link }}">Get started</a></p>
`;

const { html, text } = renderEmail(template, {
  name: 'Alice',
  link: 'https://example.com/onboarding',
});

await sender.send({
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Welcome!',
  html,
  text,
});

In-App Notifications

import { createNotificationCenter } from '@basenative/notify';

const notifications = createNotificationCenter();

notifications.add({ type: 'info', message: 'Your report is ready.' });
notifications.add({ type: 'error', message: 'Payment failed.', persistent: true });

// Read all active notifications
const all = notifications.getAll();
notifications.dismiss(all[0].id);

API

Email

  • renderEmail(template, data) — Interpolates {{ variable }} placeholders in an HTML template. Returns { html, text } where text is a plain-text version derived from the HTML.
  • createEmailSender(transport) — Creates a sender bound to a transport. Returns { send(options) } where options are { to, from, subject, html, text? }.

Escaping

Every {{ variable }} value is HTML-escaped by default, using the same escapeAttr helper @basenative/server uses for SSR templates (@basenative/runtime/shared/escape). A value that contains <script> or other markup is rendered as inert text, not executable HTML:

renderEmail('<p>Hi {{ name }}</p>', { name: '<script>alert(1)</script>' });
// => { html: '<p>Hi &lt;script&gt;alert(1)&lt;/script&gt;</p>', ... }

To insert trusted HTML without escaping it, wrap the value in raw():

import { raw } from '@basenative/runtime/shared/escape';

renderEmail('<div>{{ body }}</div>', { body: raw('<strong>Bold</strong>') });
// => { html: '<div><strong>Bold</strong></div>', ... }

Only pass raw() around HTML you trust — it disables escaping entirely for that value, in every position the placeholder appears ({{ }} interpolation here has no idea whether it landed in a text node or an attribute value, so opting out of escaping opts out of both).

Transports

  • createSmtpTransport(options) — Sends email via SMTP. Options: host, port, secure, auth: { user, pass }.
  • createSendGridTransport(options) — Sends email via the SendGrid API. Options: apiKey.
  • createResendTransport(options) — Sends email via the Resend API. Options: apiKey.

In-App Notifications

  • createNotificationCenter() — Creates an in-app notification store.
    • .add(notification) — Adds a notification. Fields: type ('info', 'warn', 'error', 'success'), message, persistent?, metadata?. Returns the created notification with an auto-generated id.
    • .dismiss(id) — Removes a notification by ID.
    • .getAll() — Returns all active notifications.
    • .clear() — Removes all notifications.

License

Apache-2.0

版本与发布记录

@basenative/notify 共发布 11 个版本,首次发布于 2026/03/20;过去 12 个月发布了 11 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.0.0latest2026/10/312 天前
2.4.02026/10/268 天前
2.3.22026/10/2212 天前
2.3.12026/10/2212 天前
2.3.02026/10/2212 天前
2.2.02026/10/2113 天前

关于 @basenative/notify 的常见问题

@basenative/notify 是什么?

电子邮件通知通过SMTP和SendGrid与模板呈现

如何安装 @basenative/notify?

在项目目录运行 npm install @basenative/notify,或使用 pnpm add / yarn add / bun add。

@basenative/notify 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@basenative/notify 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@basenative/notify 可以商用吗?

@basenative/notify 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@basenative/notify 还在维护吗?

最新版本 3.0.0 发布于 2026/10/31(2 天前);至今共发布 11 个版本,其中过去 12 个月发布了 11 个;首次发布于 2026/03/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。