从 Angular 迁移到 Analog
一个现有的 Angular 单页应用可以通过一个 Angular CLI 或者 Nx 工作区的原理器/生成器配置成使用 Analog。
Analog 兼容 Angular v15 及以上版本.
使用原理器/生成器
首先,安装 @analogjs/platform 软件包:
- npm
- Yarn
- pnpm
npm install @analogjs/platform --save-dev
yarn add @analogjs/platform --dev
pnpm install -w @analogjs/platform
下一步,执行一下命令来配置 Vite,更新项目配置的构建/伺服的目标,移动必须的文件并且设置 Vitest 进行单元测试(可选)
npx ng generate @analogjs/platform:migrate --project [your-project-name]
Nx 项目:
npx nx generate @analogjs/platform:migrate --project [your-project-name]
更新全局样式和脚本
如果在你的 angular.json 里有全局的脚本或者样式文件,把他们移动到 index.html 里的 head 里。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>My Analog app</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="stylesheet" href="/src/styles.css" />
</head>
<body>
<app-root></app-root>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
设置环境
在 Angular 应用程序中,fileReplacements 是在 angular.json 中针对不同环境进行配置的。
使用环境变量
在 Analog 中,你可以设置并使用环境变量。这是推荐的方法。
在应用程序的根目录添加一个 .env 文件,并为任何公共环境变量加上 VITE_ 前缀。不要将此文件提交到你的源代码仓库中。
VITE_MY_API_KEY=development-key
# 仅在服务器构建中可用
MY_SERVER_API_KEY=development-server-key
在你的代码中导入并使用环境变量。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private readonly apiKey = import.meta.env['VITE_MY_API_KEY'];
constructor(private http: HttpClient) {}
}
部署时,将环境变量设置为生产环境对应的值。
VITE_MY_API_KEY=production-key
# 仅在服务器构建中可用
MY_SERVER_API_KEY=production-server-key
阅读这里了解更多关于环境变量的信息。
使用文件替换
你也可以使用 fileReplacements 选项来替换文件。
/// <reference types="vitest" />
import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
build: {
target: ['es2020'],
},
resolve: {
mainFields: ['module'],
},
plugins: [
analog({
fileReplacements:
mode === 'production'
? [
{
replace: 'src/environments/environment.ts',
with: 'src/environments/environment.prod.ts',
},
]
: [],
}),
],
test: {
globals: true,
environment: 'jsdom',
setupFiles: ['src/test-setup.ts'],
include: ['**/*.spec.ts'],
reporters: ['default'],
},
define: {
'import.meta.vitest': mode !== 'production',
},
}));
复制资产
默认情况下,public 目录中的静态资产会复制到构建输出目录。如果要复制该目录之外的其他资产,请使用 nxCopyAssetsPlugin Vite 插件。
导入插件并进行设置:
/// <reference types="vitest" />
import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
// ...
plugins: [analog(), nxCopyAssetsPlugin(['*.md'])],
}));
启用 HMR
Angular 支持 HMR/Live reload,在大多数情况下,无需重新加载页面即可更新组件。要在 Analog 中启用它,请使用 liveReload: true 选项。
/// <reference types="vitest" />
import { defineConfig } from 'vite';
import analog from '@analogjs/platform';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({
// .. 其他配置
plugins: [
analog({
liveReload: true,
}),
],
}));