From 35fcdd955bbbe82d3bb087041d1f23ff71c65ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=AF=85?= Date: Tue, 18 Aug 2020 17:05:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20=E9=80=9A=E8=BF=87=20con?= =?UTF-8?q?fig.miniAppBuildType=20=E6=9D=A5=E6=94=AF=E6=8C=81=20Rax=20?= =?UTF-8?q?=E7=9A=84=20runtime=20=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generator/ProjectBuilder.ts | 12 ++ .../plugins/project/framework/rax/index.ts | 2 + .../framework/rax/plugins/buildConfig.ts | 52 +++++++ .../project/framework/rax/template/index.ts | 6 +- .../code-generator/src/solutions/rax-app.ts | 1 + packages/code-generator/src/types/schema.ts | 1 + .../test-cases/rax-app/demo4/README.md | 1 + .../demo4/expected/demo-project/.editorconfig | 12 ++ .../demo4/expected/demo-project/.eslintignore | 11 ++ .../demo4/expected/demo-project/.eslintrc.js | 3 + .../demo4/expected/demo-project/.gitignore | 17 +++ .../demo4/expected/demo-project/README.md | 15 ++ .../demo4/expected/demo-project/abc.json | 7 + .../demo4/expected/demo-project/build.json | 15 ++ .../demo4/expected/demo-project/package.json | 34 +++++ .../demo4/expected/demo-project/src/app.js | 6 + .../demo4/expected/demo-project/src/app.json | 11 ++ .../demo-project/src/document/index.jsx | 25 ++++ .../expected/demo-project/src/global.scss | 9 ++ .../demo-project/src/pages/Home/index.css | 0 .../demo-project/src/pages/Home/index.jsx | 134 ++++++++++++++++++ .../demo4/expected/demo-project/src/utils.js | 1 + .../test-cases/rax-app/demo4/schema.json5 | 84 +++++++++++ 23 files changed, 457 insertions(+), 2 deletions(-) create mode 100644 packages/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts create mode 100644 packages/code-generator/test-cases/rax-app/demo4/README.md create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.editorconfig create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintignore create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintrc.js create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.gitignore create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/README.md create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/abc.json create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/build.json create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/package.json create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.js create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.json create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/document/index.jsx create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/global.scss create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/pages/Home/index.css create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/pages/Home/index.jsx create mode 100644 packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/utils.js create mode 100644 packages/code-generator/test-cases/rax-app/demo4/schema.json5 diff --git a/packages/code-generator/src/generator/ProjectBuilder.ts b/packages/code-generator/src/generator/ProjectBuilder.ts index 26ed4f4d8..f0a13e962 100644 --- a/packages/code-generator/src/generator/ProjectBuilder.ts +++ b/packages/code-generator/src/generator/ProjectBuilder.ts @@ -128,6 +128,16 @@ export class ProjectBuilder implements IProjectBuilder { }); } + // buildConfig + if (builders.buildConfig) { + const { files } = await builders.buildConfig.generateModule(parseResult); + + buildResult.push({ + path: this.template.slots.buildConfig.path, + files, + }); + } + // constants? if (parseResult.project && builders.constants && this.template.slots.constants) { const { files } = await builders.constants.generateModule(parseResult.project); @@ -188,6 +198,8 @@ export class ProjectBuilder implements IProjectBuilder { }); } + // TODO: 更多 slots 的处理??是不是可以考虑把 template 中所有的 slots 都处理下? + // Post Process // Combine Modules diff --git a/packages/code-generator/src/plugins/project/framework/rax/index.ts b/packages/code-generator/src/plugins/project/framework/rax/index.ts index 3f9080565..a17e82132 100644 --- a/packages/code-generator/src/plugins/project/framework/rax/index.ts +++ b/packages/code-generator/src/plugins/project/framework/rax/index.ts @@ -1,6 +1,7 @@ import template from './template'; import entry from './plugins/entry'; import appConfig from './plugins/appConfig'; +import buildConfig from './plugins/buildConfig'; import entryDocument from './plugins/entryDocument'; import globalStyle from './plugins/globalStyle'; import packageJSON from './plugins/packageJSON'; @@ -9,6 +10,7 @@ export default { template, plugins: { appConfig, + buildConfig, entry, entryDocument, globalStyle, diff --git a/packages/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts b/packages/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts new file mode 100644 index 000000000..d29f2b8cc --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts @@ -0,0 +1,52 @@ +import { COMMON_CHUNK_NAME } from '../../../../../const/generator'; + +import { + BuilderComponentPlugin, + BuilderComponentPluginFactory, + ChunkType, + FileType, + ICodeStruct, + IParseResult, +} from '../../../../../types'; + +const pluginFactory: BuilderComponentPluginFactory = () => { + const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => { + const next: ICodeStruct = { + ...pre, + }; + + const ir = next.ir as IParseResult; + const miniAppBuildType = ir.project?.config.miniAppBuildType; + + const buildCfg = { + inlineStyle: false, + plugins: [ + [ + 'build-plugin-rax-app', + { + targets: ['web', 'miniapp'], + miniapp: miniAppBuildType + ? { + buildType: miniAppBuildType, + } + : undefined, + }, + ], + '@ali/build-plugin-rax-app-def', + ], + }; + + next.chunks.push({ + type: ChunkType.STRING, + fileType: FileType.JSON, + name: COMMON_CHUNK_NAME.CustomContent, + content: JSON.stringify(buildCfg, null, 2) + '\n', + linkAfter: [], + }); + + return next; + }; + return plugin; +}; + +export default pluginFactory; diff --git a/packages/code-generator/src/plugins/project/framework/rax/template/index.ts b/packages/code-generator/src/plugins/project/framework/rax/template/index.ts index 6859817ba..924a599cb 100644 --- a/packages/code-generator/src/plugins/project/framework/rax/template/index.ts +++ b/packages/code-generator/src/plugins/project/framework/rax/template/index.ts @@ -9,7 +9,6 @@ import file2 from './files/eslintrc.js'; import file3 from './files/gitignore'; import file4 from './files/README.md'; import file5 from './files/abc.json'; -import file6 from './files/build.json'; const raxAppTemplate: IProjectTemplate = { slots: { @@ -31,6 +30,10 @@ const raxAppTemplate: IProjectTemplate = { path: ['src'], fileName: 'app', }, + buildConfig: { + path: [], + fileName: 'build', + }, constants: { path: ['src'], fileName: 'constants', @@ -66,7 +69,6 @@ const raxAppTemplate: IProjectTemplate = { runFileGenerator(root, file3); runFileGenerator(root, file4); runFileGenerator(root, file5); - runFileGenerator(root, file6); return root; }, diff --git a/packages/code-generator/src/solutions/rax-app.ts b/packages/code-generator/src/solutions/rax-app.ts index 85a0367f6..319cd53f2 100644 --- a/packages/code-generator/src/solutions/rax-app.ts +++ b/packages/code-generator/src/solutions/rax-app.ts @@ -52,6 +52,7 @@ export default function createIceJsProjectBuilder(): IProjectBuilder { css(), ], appConfig: [raxApp.plugins.appConfig()], + buildConfig: [raxApp.plugins.buildConfig()], entry: [raxApp.plugins.entry()], constants: [constants()], utils: [esModule(), utils()], diff --git a/packages/code-generator/src/types/schema.ts b/packages/code-generator/src/types/schema.ts index cb8ac1f23..8f7500a5e 100644 --- a/packages/code-generator/src/types/schema.ts +++ b/packages/code-generator/src/types/schema.ts @@ -56,6 +56,7 @@ export interface IAppConfig { targetRootID?: string; // 渲染根节点 ID layout?: NodeSchema; theme?: object; // 主题配置,根据接入的主题模块不同 + miniAppBuildType?: 'runtime' | 'compile'; // 小程序的构建类型 } export interface IAppMeta { diff --git a/packages/code-generator/test-cases/rax-app/demo4/README.md b/packages/code-generator/test-cases/rax-app/demo4/README.md new file mode 100644 index 000000000..b6613c4d3 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/README.md @@ -0,0 +1 @@ +# 这个 demo 是用来演示运行时的方案的。 diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.editorconfig b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.editorconfig new file mode 100644 index 000000000..5760be583 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintignore b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintignore new file mode 100644 index 000000000..3b437e614 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintignore @@ -0,0 +1,11 @@ +# 忽略目录 +build/ +tests/ +demo/ + +# node 覆盖率文件 +coverage/ + +# 忽略文件 +**/*-min.js +**/*.min.js diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintrc.js b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintrc.js new file mode 100644 index 000000000..e2a7c5b54 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['rax'], +}; diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.gitignore b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.gitignore new file mode 100644 index 000000000..50a53dace --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/.gitignore @@ -0,0 +1,17 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +*~ +*.swp +*.log + +.DS_Store +.idea/ +.temp/ + +build/ +dist/ +lib/ +coverage/ +node_modules/ + +template.yml diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/README.md b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/README.md new file mode 100644 index 000000000..6eff85d41 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/README.md @@ -0,0 +1,15 @@ +# @ali/rax-component-demo + +## Getting Started + +### `npm run start` + +Runs the app in development mode. + +Open [http://localhost:9999](http://localhost:9999) to view it in the browser. + +The page will reload if you make edits. + +### `npm run build` + +Builds the app for production to the `build` folder. diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/abc.json b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/abc.json new file mode 100644 index 000000000..f9ee40f71 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/abc.json @@ -0,0 +1,7 @@ +{ + "type": "rax", + "builder": "@ali/builder-rax-v1", + "info": { + "raxVersion": "1.x" + } +} diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/build.json b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/build.json new file mode 100644 index 000000000..69a413ad0 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/build.json @@ -0,0 +1,15 @@ +{ + "inlineStyle": false, + "plugins": [ + [ + "build-plugin-rax-app", + { + "targets": ["web", "miniapp"], + "miniapp": { + "buildType": "runtime" + } + } + ], + "@ali/build-plugin-rax-app-def" + ] +} diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/package.json b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/package.json new file mode 100644 index 000000000..c8b7cf47b --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/package.json @@ -0,0 +1,34 @@ +{ + "name": "@ali/rax-app-demo", + "private": true, + "version": "1.0.0", + "scripts": { + "build": "build-scripts build", + "start": "build-scripts start", + "lint": "eslint --ext .js --ext .jsx ./" + }, + "dependencies": { + "@ali/lowcode-datasource-engine": "^0.1.0", + "universal-env": "^3.2.0", + "rax": "^1.1.0", + "rax-app": "^2.0.0", + "rax-document": "^0.1.0", + "@alife/right-design-card": "*", + "rax-view": "^1.0.0", + "rax-text": "^1.0.0", + "rax-image": "^1.0.0" + }, + "devDependencies": { + "build-plugin-rax-app": "^5.0.0", + "@alib/build-scripts": "^0.1.0", + "@typescript-eslint/eslint-plugin": "^2.11.0", + "@typescript-eslint/parser": "^2.11.0", + "babel-eslint": "^10.0.3", + "eslint": "^6.8.0", + "eslint-config-rax": "^0.1.0", + "eslint-plugin-import": "^2.20.0", + "eslint-plugin-module": "^0.1.0", + "eslint-plugin-react": "^7.18.0", + "@ali/build-plugin-rax-app-def": "^1.0.0" + } +} diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.js b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.js new file mode 100644 index 000000000..bc474c6e3 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.js @@ -0,0 +1,6 @@ +import { runApp } from 'rax-app'; +import appConfig from './app.json'; + +import './global.scss'; + +runApp(appConfig); diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.json b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.json new file mode 100644 index 000000000..63dec4d7d --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/app.json @@ -0,0 +1,11 @@ +{ + "routes": [ + { + "path": "/", + "source": "pages/Home/index" + } + ], + "window": { + "title": "Rax App Demo" + } +} diff --git a/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/document/index.jsx b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/document/index.jsx new file mode 100644 index 000000000..50569a9b6 --- /dev/null +++ b/packages/code-generator/test-cases/rax-app/demo4/expected/demo-project/src/document/index.jsx @@ -0,0 +1,25 @@ +import { createElement } from 'rax'; +import { Root, Style, Script } from 'rax-document'; + +function Document() { + return ( + + + + + Rax App Demo +