我正在将现有的AngularJS应用程序转换为混合应用程序,开始逐步将其升级到Angular 4.我想了解Angular 4如何在现有的AngularJS中引用。在现有的AngularJS应用程序中,很清楚如何加载AngularJS框架 - 它只是一个包含的脚本文件:
<script src="/angular/angular.js"></script>
为了熟悉最新的Angular版本,我使用https://angular.io/guide/quickstart上的Angular快速入门指南创建了一个单独的“quickstart”Angular 5 应用程序,我可以运行它使用:
ng serve --open
当我查看项目文件时,我没有看到角度框架实际被加载的位置。该应用程序的src / index.html文件中没有任何脚本,它只是声明一个组件(app.component.ts)的指令,如下所示:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Test Angular 5 app';
}
导入实际从哪里导入? Angular文档说明了它的index.html文件:
当有人访问您的网站时提供的主HTML页面。最 你永远不需要编辑它的时间。 CLI会自动添加 构建应用程序时所有js和css文件,您永远不需要添加 手动的任何或标签。
那么这里发生了什么? @ angular / core实际上是如何引用的?
答案 0 :(得分:3)
使用Angular CLI时,我们有很多活动部件。为了真正了解正在发生的事情,我们应该回顾一下Angular CLI中使用的一些核心技术,因为它们与输出文件和模块解析有关:
webpack.config.js
中定义的入口点,获取已转换的TypeScript代码并构建导入/导出的依赖关系图。此依赖关系图将包含所有模块,并将这些模块打包为1 + 捆绑,具体取决于配置。这是@angular/core
依赖项(位于node_modules/@angular/core
)由Webpack处理并添加到可在运行时访问的包中的步骤。 您可以通过在HTML中包含生成的文件,将生成的包加载到页面中。对于JS文件,您可以像使用AngularJS一样使用script
标记加载它们。
因为我们使用的是Angular CLI,所以Webpack中有很多配置默认设置,所以我们将有多个生成的bundle。
我刚刚创建了一个空的Angular CLI项目,并检查了HTML以查看5个生成的包:
将Angular项目文件与AngularJS文件进行比较时,复杂性的核心是Angular代码通过多个构建步骤进行转换,而AngularJS代码通常与ES5一起使用。如果要将Webpack和TypeScript添加到AngularJS构建中,您会看到与Angular输出非常相似的内容。
Angular CLI中配置的Webpack在哪里?
在幕后,Angular CLI使用Webpack构建您的项目并捆绑您的文件。
Angular团队选择不为Angular CLI公开可配置的Webpack配置文件,但他们确实添加了ng eject
,它生成了与项目的Webpack构建匹配的webpack.config.js
。弹出的缺点是您将不再使用ng serve
来为您的项目服务。相反,您将使用npm run build && npm run start
(弹出后会看到这些脚本添加到package.json
),这将根据生成的webpack.config.js
文件构建和提供项目。
如果您需要对默认的Webpack构建进行自定义修改,则此功能非常重要。
详细了解ng eject
here。
生成的捆绑包在哪里?
如果您使用ng serve
,则不会看到任何生成的文件,因为这些文件是从内存而非磁盘(到当文件不断变化时加快开发速度),因此生成的文件不在任何文件夹中。
如果您想查看生成的文件,可以运行ng build
,这将创建一个dist
文件夹,其中包含index.html
和相关资产/包。
请注意,默认情况下,构建或投放项目的所有命令都会删除dist
文件夹,除非您在构建/投放时传递--no-delete-output-path
。
答案 1 :(得分:1)
您需要了解导入和导出如何在 TypeScript
中工作导出声明
任何声明(例如变量,函数,类,类型别名或 可以通过添加export关键字来导出接口。
Validation.ts
export interface StringValidator {
isAcceptable(s: string): boolean;
}
ZipCodeValidator.ts
export const numberRegexp = /^[0-9]+$/;
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
导出语句
当需要重命名导出时,导出语句很方便 消费者,所以上面的例子可以写成:
ZipCodeValidator.ts
class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
export { ZipCodeValidator };
export { ZipCodeValidator as mainValidator };
导入强>
导入就像从模块导出一样简单。输入 导出的声明是通过使用其中一个导入表单完成的 下面:
从模块导入单个导出
import { ZipCodeValidator } from "./ZipCodeValidator";
let myValidator = new ZipCodeValidator();
导入也可以重命名
import { ZipCodeValidator as ZCV } from "./ZipCodeValidator";
let myValidator = new ZCV();
将整个模块导入单个变量,并使用它来访问模块导出
import * as validator from "./ZipCodeValidator";
let myValidator = new validator.ZipCodeValidator();
由于您遵循了Angular快速入门指南,因此必须使用 npm 来安装模块和依赖项。
如果您阅读angular.io/npm
@ angular / core:每个人都需要框架的关键运行时部分 应用。包括所有元数据装饰器,组件,指令, 依赖注入和组件生命周期挂钩。
默认情况下,npm将所有依赖项存储在 node_modules 目录中。
因此,您要从位于 node_modules 目录中的 @ angular / core 导入组件。