自定义 Angular 示意图极慢
Custom Angular Schematics extremly slow
我正在开发一个自定义包,它将通过为规范文件提供自定义模板来覆盖默认 Angular 示意图。
所以 运行 ng generate component
应该像在默认示意图中一样创建一个组件,但是规范文件应该被我的模板覆盖。
除了生成组件所需的时间之外,该包按预期工作。生成它需要超过 3 分钟!我不知道为什么因为我的设置看起来很简单而且我不知道瓶颈可能是什么。
我将不胜感激任何想法,可能有什么问题,或者至少如何检查,是什么导致了问题。
这是我的代码:
collection.js
{
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
"extends": [
"@schematics/angular"
],
"schematics": {
"component": {
"factory": "./component/index#Component",
"schema": "./component/schema.json"
},
}
}
工厂 - index.ts
export function parseName(path: string, name: string) {
const nameWithoutPath = basename(name as Path);
const namePath = dirname((path + '/' + name) as Path);
return {
name: nameWithoutPath,
path: normalize('/' + namePath),
};
}
export function Component(_options: any): Rule {
const parsedPath = parseName(_options.path || '.', _options.name);
console.log('generating component using custom schematics');
return chain([
externalSchematic('@schematics/angular', 'component', _options),
filter(f => !f.endsWith('spec.ts')),
mergeWith(apply(url('./files'), [ // Custom spec files are located here.
template({
..._options,
name: parsedPath.name,
classify: strings.classify,
dasherize: strings.dasherize,
}),
move(normalize(parsedPath.path as string)),
])),
]);
}
模板 - 文件
import { <%= classify(name) %>Component } from './<%= dasherize(name) %>.component';
describe('<%= classify(name) %>Component', () => {
let component: <%= classify(name) %>Component;
beforeEach(() => {
component = new <%= classify(name) %>Component();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
如您所见,在生成组件的函数中,我放置了一个控制台日志 - 它立即出现在终端中,而 运行 ng g component
,然后需要 3 分钟以上才能完成其余代码...
我意识到缓慢的行为是 filter
函数的结果。我想它不仅会过滤原理图中创建的文件,还会检查每个项目文件。
这是我摆脱 filter
功能所做的:)
mergeWith(templateSource, MergeStrategy.Overwrite),
templateSource
与原问题相同。
我正在开发一个自定义包,它将通过为规范文件提供自定义模板来覆盖默认 Angular 示意图。
所以 运行 ng generate component
应该像在默认示意图中一样创建一个组件,但是规范文件应该被我的模板覆盖。
除了生成组件所需的时间之外,该包按预期工作。生成它需要超过 3 分钟!我不知道为什么因为我的设置看起来很简单而且我不知道瓶颈可能是什么。 我将不胜感激任何想法,可能有什么问题,或者至少如何检查,是什么导致了问题。
这是我的代码:
collection.js
{
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
"extends": [
"@schematics/angular"
],
"schematics": {
"component": {
"factory": "./component/index#Component",
"schema": "./component/schema.json"
},
}
}
工厂 - index.ts
export function parseName(path: string, name: string) {
const nameWithoutPath = basename(name as Path);
const namePath = dirname((path + '/' + name) as Path);
return {
name: nameWithoutPath,
path: normalize('/' + namePath),
};
}
export function Component(_options: any): Rule {
const parsedPath = parseName(_options.path || '.', _options.name);
console.log('generating component using custom schematics');
return chain([
externalSchematic('@schematics/angular', 'component', _options),
filter(f => !f.endsWith('spec.ts')),
mergeWith(apply(url('./files'), [ // Custom spec files are located here.
template({
..._options,
name: parsedPath.name,
classify: strings.classify,
dasherize: strings.dasherize,
}),
move(normalize(parsedPath.path as string)),
])),
]);
}
模板 - 文件
import { <%= classify(name) %>Component } from './<%= dasherize(name) %>.component';
describe('<%= classify(name) %>Component', () => {
let component: <%= classify(name) %>Component;
beforeEach(() => {
component = new <%= classify(name) %>Component();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
如您所见,在生成组件的函数中,我放置了一个控制台日志 - 它立即出现在终端中,而 运行 ng g component
,然后需要 3 分钟以上才能完成其余代码...
我意识到缓慢的行为是 filter
函数的结果。我想它不仅会过滤原理图中创建的文件,还会检查每个项目文件。
这是我摆脱 filter
功能所做的:)
mergeWith(templateSource, MergeStrategy.Overwrite),
templateSource
与原问题相同。