From 574e348c1e8fa160129d6b90e3a19e2bebb2b301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LeoYuan=20=E8=A2=81=E5=8A=9B=E7=9A=93?= Date: Thu, 2 Feb 2023 20:12:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20esModule#preferCla?= =?UTF-8?q?ssProperty=20=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generator/ProjectBuilder.ts | 19 ++++++++++++ .../src/plugins/common/esmodule.ts | 4 ++- .../component/react/containerInjectUtils.ts | 29 ++++++++++++++----- .../src/postprocessor/prettier/index.ts | 2 ++ modules/code-generator/src/types/core.ts | 3 ++ .../code-generator/src/types/intermediate.ts | 1 + 6 files changed, 50 insertions(+), 8 deletions(-) diff --git a/modules/code-generator/src/generator/ProjectBuilder.ts b/modules/code-generator/src/generator/ProjectBuilder.ts index 819f37c5c..040136057 100644 --- a/modules/code-generator/src/generator/ProjectBuilder.ts +++ b/modules/code-generator/src/generator/ProjectBuilder.ts @@ -24,22 +24,31 @@ interface IModuleInfo { } export interface ProjectBuilderInitOptions { + /** 项目模板 */ template: IProjectTemplate; + /** 项目插件 */ plugins: IProjectPlugins; + /** 模块后置处理器 */ postProcessors: PostProcessor[]; + /** Schema 解析器 */ schemaParser?: ISchemaParser; + /** 项目级别的前置处理器 */ projectPreProcessors?: ProjectPreProcessor[]; + /** 项目级别的后置处理器 */ projectPostProcessors?: ProjectPostProcessor[]; + /** 是否处于严格模式 */ inStrictMode?: boolean; + /** 一些额外的上下文数据 */ extraContextData?: Record; + /** * Hook which is used to customize original options, we can reorder/add/remove plugins/processors * of the existing solution. @@ -264,6 +273,16 @@ export class ProjectBuilder implements IProjectBuilder { } // TODO: 更多 slots 的处理??是不是可以考虑把 template 中所有的 slots 都处理下? + // const whitelistSlotNames = [ + // 'router', + // 'entry', + // 'appConfig', + // 'buildConfig', + // 'router', + // ]; + // Object.keys(this.template.slots).forEach((slotName: string) => { + + // }); // Post Process const isSingleComponent = parseResult?.project?.projectRemark?.isSingleComponent; diff --git a/modules/code-generator/src/plugins/common/esmodule.ts b/modules/code-generator/src/plugins/common/esmodule.ts index 04dfd1ce2..09c6aec59 100644 --- a/modules/code-generator/src/plugins/common/esmodule.ts +++ b/modules/code-generator/src/plugins/common/esmodule.ts @@ -443,6 +443,7 @@ function buildPackageImport( export interface PluginConfig { fileType?: string; // 导出的文件类型 useAliasName?: boolean; // 是否使用 componentName 重命名组件 identifier + filter?: (deps: IDependency[]) => IDependency[]; // 支持过滤能力 } const pluginFactory: BuilderComponentPluginFactory = (config?: PluginConfig) => { @@ -460,7 +461,8 @@ const pluginFactory: BuilderComponentPluginFactory = (config?: Plu const ir = next.ir as IWithDependency; if (ir && ir.deps && ir.deps.length > 0) { - const packs = groupDepsByPack(ir.deps); + const deps = cfg.filter ? cfg.filter(ir.deps) : ir.deps; + const packs = groupDepsByPack(deps); Object.keys(packs).forEach((pkg) => { const chunks = buildPackageImport(pkg, packs[pkg], cfg.fileType, cfg.useAliasName); diff --git a/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts b/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts index 33fc8c28d..c5c566e17 100644 --- a/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts +++ b/modules/code-generator/src/plugins/component/react/containerInjectUtils.ts @@ -16,6 +16,9 @@ import { export interface PluginConfig { fileType: string; + + /** prefer using class property to define utils */ + preferClassProperty?: boolean; } const pluginFactory: BuilderComponentPluginFactory = (config?) => { @@ -57,13 +60,25 @@ const pluginFactory: BuilderComponentPluginFactory = (config?) => linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport], }); - next.chunks.push({ - type: ChunkType.STRING, - fileType: cfg.fileType, - name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, - content: 'this.utils = utils;', - linkAfter: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart], - }); + if (cfg.preferClassProperty) { + // mode: class property + next.chunks.push({ + type: ChunkType.STRING, + fileType: cfg.fileType, + name: CLASS_DEFINE_CHUNK_NAME.InsVar, + content: 'utils = utils;', + linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]], + }); + } else { + // mode: assign in constructor + next.chunks.push({ + type: ChunkType.STRING, + fileType: cfg.fileType, + name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent, + content: 'this.utils = utils;', + linkAfter: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart], + }); + } if (useRef) { next.chunks.push({ diff --git a/modules/code-generator/src/postprocessor/prettier/index.ts b/modules/code-generator/src/postprocessor/prettier/index.ts index d4e61e3c0..b4c3188f3 100644 --- a/modules/code-generator/src/postprocessor/prettier/index.ts +++ b/modules/code-generator/src/postprocessor/prettier/index.ts @@ -22,6 +22,8 @@ const factory: PostProcessorFactory = (config?: ProcessorConfig let parser: prettier.BuiltInParserName | any; if (fileType === 'js' || fileType === 'jsx') { parser = 'babel'; + } else if (fileType === 'json') { + parser = 'json-stringify'; } else if (PARSERS.indexOf(fileType) >= 0) { parser = fileType; } else if (cfg.customFileTypeParser[fileType]) { diff --git a/modules/code-generator/src/types/core.ts b/modules/code-generator/src/types/core.ts index 39e4c32ba..30c86a7e9 100644 --- a/modules/code-generator/src/types/core.ts +++ b/modules/code-generator/src/types/core.ts @@ -22,8 +22,10 @@ export enum FileType { LESS = 'less', HTML = 'html', JS = 'js', + MJS = 'mjs', JSX = 'jsx', TS = 'ts', + MTS = 'mts', TSX = 'tsx', JSON = 'json', MD = 'md', @@ -168,6 +170,7 @@ export interface IProjectBuilderOptions { * - expr: 求值的表达式 */ evalErrorsHandler?: string; + /** * Hook which is used to customize original options, we can reorder/add/remove plugins/processors * of the existing solution. diff --git a/modules/code-generator/src/types/intermediate.ts b/modules/code-generator/src/types/intermediate.ts index 30d6c4f7f..7cba0bd44 100644 --- a/modules/code-generator/src/types/intermediate.ts +++ b/modules/code-generator/src/types/intermediate.ts @@ -42,6 +42,7 @@ export interface IRouterInfo extends IWithDependency { * project's remarks */ export interface ProjectRemark { + /** if current project only contain one container which type is `Component` */ isSingleComponent?: boolean; }