如何修改 Angular 应用的 root context url

有一个 note 给出了解决方案和 sample code:

angular.json 是 Angular 项目的配置文件,其中定义了整个项目的编译、构建以及开发环境的各种细节。对于 angular.json 中的 "build" 部分,其定义了构建项目所需的具体配置。这里具体的代码如下:

"build": {
    "builder": "@angular-devkit/build-angular:browser",
    "options": {
        "deployUrl": "/shop/",
        "outputPath": "dist/spartacusstore/browser/shop",
        "index": "src/index.html",
        "main": "src/main.ts"
    }
}

为了逐个解释,我们从 "build" 的每一个键值对进行分析。

1. "build"

这个属性是 Angular 项目构建任务的配置入口。在 angular.json 中,"build"projects 部分中定义的一个任务类型。它代表着对该项目的构建配置,包含了如何打包、编译等具体细节。

"build" 节点是一个对象,主要包含以下几个重要键值:

  • "builder"
  • "options"
  • "configurations"(虽然在上述例子中没有给出,但在实际项目中很常见)

2. "builder": "@angular-devkit/build-angular:browser"

"builder" 字段用于定义该项目的构建工具。builder 的作用是在构建阶段执行一系列预定义的任务。

在这个例子中,builder 设置为 @angular-devkit/build-angular:browser,这意味着 Angular 将使用 @angular-devkit/build-angular 提供的构建工具,并且目标平台是 browser,也就是浏览器环境。

Angular 提供了许多构建工具,@angular-devkit/build-angular 是官方的默认构建工具包,包含了一些常见的构建功能,比如编译 TypeScript、优化资源、生成 HTML 文件等。而 :browser 则表示这个构建过程的目标是一个浏览器应用程序(即我们所说的前端 Web 应用)。

举例说明:

例如,假设你有一个服务器端渲染的项目,你可能需要使用 @angular-devkit/build-angular:server 作为 builder,这样就可以专门为服务器端生成代码。而这里选择的是 :browser,表明这个项目是要运行在浏览器中的前端应用程序。

3. "options"

"options" 字段包含了构建时使用的各种参数,这些参数用于配置构建工具的行为。它是一个对象,包含多种配置项。下面逐一解释每个参数。

4. "deployUrl": "/shop/"

"deployUrl" 是配置生成的静态资源(例如 JavaScript、CSS 文件等)在发布后的路径前缀。在构建 Angular 应用程序时,应用程序的 HTML 文件通常需要引用一些资源文件,比如 CSS、JS、图片等。deployUrl 指定了这些资源在最终生成后的相对路径前缀。

"deployUrl": "/shop/" 意味着在构建后的 HTML 文件中引用的静态资源路径前都会添加 /shop/,从而使得最终生成的静态资源文件的 URL 看起来像 http://yourdomain.com/shop/main.js。这对于当应用程序部署在某个特定的子路径时非常有用,比如你可能的站点不是根目录,而是一个二级目录 /shop/

举例说明:

假设构建生成了一个 JavaScript 文件 main.js,如果没有设置 deployUrl,引用路径可能是:

<script src="main.js"></script>

但是,如果设置了 "deployUrl": "/shop/",那么引用路径将变成:

<script src="/shop/main.js"></script>

这种方式可以确保所有静态资源都从指定的 /shop/ 目录下加载,而不是默认的根目录。

5. "outputPath": "dist/spartacusstore/browser/shop"

"outputPath" 字段用于指定构建输出的目录。构建完成后,所有的构建产物(例如 HTML、CSS、JS 文件)都会被放置在这个目录中。

"outputPath": "dist/spartacusstore/browser/shop" 意味着所有的构建输出文件将被放置到项目根目录下的 dist/spartacusstore/browser/shop 文件夹中。

这样做的好处是,可以清晰地将构建结果与源代码区分开来,同时也便于部署。通常在 CI/CD(持续集成和持续交付)流程中,outputPath 会被上传到服务器,供最终用户访问。

举例说明:

比如,执行 ng build 命令之后,你可以在项目的 dist/spartacusstore/browser/shop 目录中看到类似以下结构的文件:

|-- dist
    |-- spartacusstore
        |-- browser
            |-- shop
                |-- index.html
                |-- main.js
                |-- polyfills.js
                |-- runtime.js
                |-- styles.css

这些文件便是经过编译、打包和优化之后的最终产物。

6. "index": "src/index.html"

"index" 字段用于指定构建时使用的主 HTML 文件的路径。在 Angular 应用中,index.html 是应用的入口文件,这个文件定义了应用的基本结构,主要用来加载其他的 JavaScript 和 CSS 文件。

"index": "src/index.html" 表明使用项目目录中的 src/index.html 作为项目的入口 HTML 文件。构建时,Angular CLI 会根据该文件来生成最终的 index.html,并将所有必要的脚本和样式表注入到这个文件中。

举例说明:

假设 src/index.html 文件内容如下:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Spartacus Store</title>
  <base href="/">
</head>
<body>
  <app-root></app-root>
</body>
</html>

在构建完成后,Angular CLI 会将所有打包生成的脚本文件插入到这个 index.html 中,生成类似于以下内容:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Spartacus Store</title>
  <base href="/">
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <app-root></app-root>
  <script src="runtime.js"></script>
  <script src="polyfills.js"></script>
  <script src="main.js"></script>
</body>
</html>

这使得浏览器能够正确地加载和显示应用程序。

7. "main": "src/main.ts"

"main" 字段用于指定应用程序的主入口文件,这个文件是应用程序启动的起点。Angular 应用的主入口文件通常是一个 TypeScript 文件,其中包含了应用启动的逻辑。

"main": "src/main.ts" 表示使用 src 目录下的 main.ts 文件作为应用的入口点。该文件通常包含了 Angular 的启动代码,比如引导根模块。

举例说明:

src/main.ts 文件可能包含如下内容:

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.error(err));

在这个文件中,platformBrowserDynamic().bootstrapModule(AppModule) 用于引导 AppModule 作为应用的根模块,这样 Angular 就可以开始渲染应用程序了。

小结

上述 angular.json 配置的 "build" 部分定义了 Angular 项目在构建过程中的一些核心参数。builder 决定了使用哪种构建工具来执行构建任务,options 提供了具体的构建选项,每个选项都有其特定的用途。

  • "deployUrl" 用于设置资源文件的部署路径前缀,便于在不同的部署环境中灵活地调整资源的引用路径。
  • "outputPath" 决定了构建产物的输出位置,这样便于管理和部署最终的构建文件。
  • "index" 定义了应用程序的 HTML 入口文件,用于启动和加载应用程序。
  • "main" 指定了应用程序的主入口 TypeScript 文件,其中包含了应用的启动逻辑。

通过这些配置,Angular CLI 可以根据开发者的需要,灵活地控制构建过程,从而生成适合部署的静态资源。理解这些配置的含义对于调整项目的构建流程、优化打包策略,以及适应不同的部署环境非常重要。在实际开发中,可能还会涉及到 "assets""styles""scripts" 等其他配置项,以进一步自定义构建行为。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容