Analog

面向 Angular 的全栈 元框架

基于 Vite。文件式路由。API 路由。SSR 与 SSG。构建现代 Angular 应用与站点所需的一切。

~/my-app
$ vite buildvite building client environment for production...vite building ssr environment for production...transforming...✓ 325 modules transformed.rendering chunks...✓ 985 modules transformed.computing gzip size...dist/client/index.html                                  1.42 kB │ gzip:  0.71 kBdist/client/assets/styles-DG3kLxYZ.css                  8.74 kB │ gzip:  2.31 kBdist/client/assets/router-Bs1mQ2Dn.js                  18.55 kB │ gzip:  6.84 kBdist/client/assets/content-BMF8KG2I.js                 59.86 kB │ gzip:  5.31 kBdist/client/assets/(home).page-CKxFXlHY.js             21.67 kB │ gzip:  5.60 kBdist/client/assets/docs.page-DdVccY_7.js                1.65 kB │ gzip:  0.82 kBdist/client/assets/__...slug__.page-BL_P3rL8.js        22.80 kB │ gzip:  6.86 kBdist/client/assets/SidebarDrawer-CauwW0x6.js           10.26 kB │ gzip:  2.94 kBdist/client/assets/index-CVGT2tp1.js                  366.98 kB │ gzip: 98.56 kBdist/ssr/assets/__...slug__.page-DtcjJoL6.mjs             0.08 kB │ gzip:  0.09 kBdist/ssr/assets/overview-BdZizd5o2.mjs                    0.33 kB │ gzip:  0.24 kBdist/ssr/assets/overview-gxyYn8v8.mjs                     0.34 kB │ gzip:  0.26 kBdist/ssr/assets/contributing-B83XZww7.mjs                 0.35 kB │ gzip:  0.24 kBdist/ssr/assets/overview-CQRmUDJ9.mjs                     0.35 kB │ gzip:  0.26 kBdist/ssr/assets/support-DLAA5sQ1.mjs                      1.46 kB │ gzip:  0.74 kBdist/ssr/assets/compatibility-BZp34UUz.mjs                1.58 kB │ gzip:  0.73 kBdist/ssr/assets/docs.page-DdVccY_7.mjs                    1.65 kB │ gzip:  0.82 kBdist/ssr/assets/introduction-N_pq0X4B.mjs                 1.66 kB │ gzip:  0.88 kBdist/ssr/assets/sponsoring-B3SIcVC_.mjs                   3.26 kB │ gzip:  1.44 kBdist/ssr/assets/ai-CM8fF-iZ.mjs                           3.37 kB │ gzip:  1.58 kBdist/ssr/assets/code-generation-D3nEY0Jc.mjs              3.46 kB │ gzip:  0.91 kBdist/ssr/assets/getting-started-BBfHjgQX.mjs              4.35 kB │ gzip:  1.19 kBdist/ssr/assets/sidebar-0YQ3z2x-.mjs                      5.00 kB │ gzip:  1.27 kBdist/ssr/assets/nx-BNqm_DkJ.mjs                           5.02 kB │ gzip:  1.63 kBdist/ssr/assets/overview-44-GjfuI.mjs                     6.48 kB │ gzip:  2.29 kBdist/ssr/assets/css-preprocessors-CQfu_AHS.mjs            8.38 kB │ gzip:  1.26 kBdist/ssr/assets/server-side-data-fetching-Cfucm9Ra.mjs    9.50 kB │ gzip:  1.60 kBdist/ssr/assets/SidebarDrawer-CauwW0x6.mjs               10.26 kB │ gzip:  2.94 kBdist/ssr/assets/middleware-C797dNXV.mjs                  10.60 kB │ gzip:  1.44 kBdist/ssr/assets/migrating-hJYmSKgU.mjs                   11.88 kB │ gzip:  1.54 kBdist/ssr/assets/contributing-XmnAkxCh.mjs                14.82 kB │ gzip:  3.31 kBdist/ssr/assets/og-image-generation-DxcxVtL1.mjs         15.48 kB │ gzip:  2.35 kBdist/ssr/assets/server-side-rendering-C01L6B-f.mjs       17.74 kB │ gzip:  2.03 kBdist/ssr/assets/angular-material-i01XyO0x.mjs            18.14 kB │ gzip:  2.48 kBdist/ssr/assets/(home).page-CKxFXlHY.mjs                 21.67 kB │ gzip:  5.60 kBdist/ssr/assets/__...slug__.page-BL_P3rL8.mjs            22.80 kB │ gzip:  6.86 kBdist/ssr/assets/metadata-C5mGU_4S.mjs                    22.59 kB │ gzip:  2.38 kBdist/ssr/assets/websockets-fkNokGag.mjs                  25.44 kB │ gzip:  2.46 kBdist/ssr/assets/libraries-BouNIxxQ.mjs                   28.63 kB │ gzip:  2.94 kBdist/ssr/assets/migrating-7oCQdL3T.mjs                   31.68 kB │ gzip:  3.39 kBdist/ssr/assets/forms-CNTfSCaP.mjs                       37.20 kB │ gzip:  3.53 kBdist/ssr/assets/vitest-Ct7_OCIH.mjs                      41.57 kB │ gzip:  4.03 kBdist/ssr/assets/providers-CWTrAY_M.mjs                   47.16 kB │ gzip:  7.26 kBdist/ssr/assets/ionic-BwIlEq-c.mjs                       51.91 kB │ gzip:  5.77 kBdist/ssr/assets/static-site-generation-C5zOsHes.mjs      58.21 kB │ gzip:  4.62 kBdist/ssr/assets/contributors-BZhKJ-kP.mjs                58.87 kB │ gzip:  7.22 kBdist/ssr/assets/storybook-BmH4JEXl.mjs                   59.04 kB │ gzip:  4.96 kBdist/ssr/assets/content-CpCKBY6T.mjs                     62.11 kB │ gzip:  5.44 kBdist/ssr/assets/providers-BB74njZp.mjs                   71.76 kB │ gzip:  9.19 kBdist/ssr/assets/content-2qeL0Vxi.mjs                     76.30 kB │ gzip:  6.34 kBdist/ssr/assets/static-site-generation-AUywW2Um.mjs      80.39 kB │ gzip:  5.36 kBdist/ssr/main.server.mjs                                130.82 kB │ gzip: 26.11 kB✓ built in 7.66s

路由

基于文件系统的路由

下的文件会成为路由。方括号表示动态参数。双方括号表示通配匹配。圆括号表示无路径分组。

无需路由配置文件,无需注册步骤。添加一个文件,即可发布一个页面。

src/app/pages/

  • (home).page.ts
  • about.page.ts
  • docs/[[...slug]].page.ts
  • products/[id].page.ts
  • api/og.ts

generated routes

  • /
  • /about
  • /docs/*
  • /products/:id
  • /api/og

全栈

客户端与服务端,一对文件

把服务端 loader 放在页面组件旁边。Analog 在服务端运行它,只把响应发送给客户端,并对响应进行端到端类型推断。

页面 导入 loader 的类型 ——无需独立的 API 客户端,也无需手动 fetch。

Page component (browser).page.ts
// src/app/pages/products/[id].page.ts
import { Component } from '@angular/core';
import { injectLoad } from '@analogjs/router';
import type { load } from './[id].server';

@Component({
  template: `
    <h1>{{ product().name }}</h1>
    <p>{{ product().price | currency }}</p>
  `,
})
export default class ProductPage {
  protected readonly product = injectLoad<typeof load>();
}
Server load (server-only).server.ts
// src/app/pages/products/[id].server.ts
import type { PageServerLoad } from '@analogjs/router';
import { db } from '~/server/db';

export const load = async ({
  params,
}: PageServerLoad) => {
  const product = await db.products.byId(
    params['id'],
  );
  return product;
};

生态

在 Angular 中,使用 Vite 生态

Analog 直接接入团队已经信赖的工具。无需 fork、无需 shim——同样的插件,同样的配置。

Analog 是免费且开源的,由我们的合作伙伴与赞助商共同支持。

合作伙伴

Zerops

赞助商

NxSnyder TechCodeRabbit
成为 Analog 合作伙伴