From c9426b0c1d518487699edc487ecbe9cfddc55eff Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 7 Dec 2020 14:39:58 +0800 Subject: [PATCH 01/21] chore: version --- packages/icejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/icejs/package.json b/packages/icejs/package.json index 245b8a1718..faa25c3a5c 100644 --- a/packages/icejs/package.json +++ b/packages/icejs/package.json @@ -1,6 +1,6 @@ { "name": "ice.js", - "version": "1.12.0", + "version": "1.12.1", "description": "command line interface and builtin plugin for icejs", "author": "ice-admin@alibaba-inc.com", "homepage": "", From 81de8ae1847a6fdc9d270d5258a6c9b9df4598c8 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Thu, 10 Dec 2020 16:02:06 +0800 Subject: [PATCH 02/21] feat: support webIDE dev url (#3907) * feat: support webide dev url * fix: ide url --- packages/plugin-react-app/src/setDev.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/plugin-react-app/src/setDev.js b/packages/plugin-react-app/src/setDev.js index e90e1d47a8..1d91a02c4f 100644 --- a/packages/plugin-react-app/src/setDev.js +++ b/packages/plugin-react-app/src/setDev.js @@ -80,8 +80,12 @@ module.exports = (api, opts) => { console.log(); console.log(chalk.green(' Starting the development server at:')); - console.log(' - Local : ', chalk.underline.white(getLocalUrl(urls.localUrlForBrowser, entryHtml))); - console.log(' - Network: ', chalk.underline.white(getLocalUrl(urls.lanUrlForTerminal, entryHtml))); + if (process.env.CLOUDIDE_ENV) { + console.log(' - IDE server: ', `https://${process.env.WORKSPACE_UUID}-${commandArgs.port}.${process.env.WORKSPACE_HOST}`); + } else { + console.log(' - Local : ', chalk.underline.white(getLocalUrl(urls.localUrlForBrowser, entryHtml))); + console.log(' - Network: ', chalk.underline.white(getLocalUrl(urls.lanUrlForTerminal, entryHtml))); + } console.log(); } } From fc77de751ee149f5c372ba1e5cea2fafdfc556cd Mon Sep 17 00:00:00 2001 From: Hengchang Lu <44047106+luhc228@users.noreply.github.com> Date: Thu, 10 Dec 2020 16:50:25 +0800 Subject: [PATCH 03/21] fix: use debug in ssr (#3908) --- packages/plugin-smart-debug/package.json | 2 +- packages/plugin-smart-debug/src/runtimePublicPathLoader.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin-smart-debug/package.json b/packages/plugin-smart-debug/package.json index 0bd10c7ad6..e89a7cb58b 100644 --- a/packages/plugin-smart-debug/package.json +++ b/packages/plugin-smart-debug/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-smart-debug", - "version": "0.1.0", + "version": "0.1.1", "description": "", "main": "lib/index.js", "scripts": { diff --git a/packages/plugin-smart-debug/src/runtimePublicPathLoader.js b/packages/plugin-smart-debug/src/runtimePublicPathLoader.js index b92ba56025..37f23a8924 100644 --- a/packages/plugin-smart-debug/src/runtimePublicPathLoader.js +++ b/packages/plugin-smart-debug/src/runtimePublicPathLoader.js @@ -1,6 +1,6 @@ module.exports = (content) => { return ` - if (window.ICE && window.ICE.debug) { + if (!process.env.__IS_SERVER__ && window.ICE && window.ICE.debug) { var debug = window.ICE.debug; __webpack_public_path__ = '//' + debug.origin + ':' + debug.port + (debug.output ? ('/' + debug.output + '/') : '/'); } From 3dfc0348267f26f54f652299a61506d39112f51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8B=92=E7=8B=92=E7=A5=9E?= Date: Fri, 11 Dec 2020 16:17:06 +0800 Subject: [PATCH 04/21] feat: support use name define mpa page name (#3906) * feat: support use name define mpa page name * fix: ts error * chore: optimize code * feat: add export source when parse entry --- packages/build-app-helpers/package.json | 2 +- .../build-app-helpers/src/getMpaEntries.ts | 52 ++++++++++++++----- .../src/getRoutesByAppJson.ts | 1 + packages/build-app-helpers/src/index.ts | 1 - packages/build-mpa-config/package.json | 2 +- .../build-mpa-config/src/generateEntry.ts | 3 +- packages/build-mpa-config/src/index.ts | 7 ++- 7 files changed, 48 insertions(+), 20 deletions(-) diff --git a/packages/build-app-helpers/package.json b/packages/build-app-helpers/package.json index 8101a1483e..0a9f6204c7 100644 --- a/packages/build-app-helpers/package.json +++ b/packages/build-app-helpers/package.json @@ -23,4 +23,4 @@ "fs-extra": "^8.1.0", "lodash": "^4.17.20" } -} \ No newline at end of file +} diff --git a/packages/build-app-helpers/src/getMpaEntries.ts b/packages/build-app-helpers/src/getMpaEntries.ts index c553252893..6857834234 100644 --- a/packages/build-app-helpers/src/getMpaEntries.ts +++ b/packages/build-app-helpers/src/getMpaEntries.ts @@ -6,30 +6,58 @@ interface IOptions { target: string; appJsonPath: string; } + +interface IEntry { + entryPath: string; + entryName: string; + pageName: string; + source?: string; +} + // Get entries when exist app.json -export default function (api, options?: IOptions) { +export default function (api, options?: IOptions): IEntry[] { const { target, appJsonPath } = options || {}; if (appJsonPath) { - return getEntriesByJson(target, appJsonPath); + return getEntriesByJson(api, target, appJsonPath); } return getEntriesByDir(api); } -function getEntriesByJson(target, appJsonPath) { +function getEntriesByJson(api, target, appJsonPath): IEntry[] { + const { + context: { rootDir }, + } = api; const routes = getRoutesByAppJson(target, { appJsonPath }); return routes.map((route) => { - const dir = path.dirname(route.source); - const pageName = path.parse(dir).name; + let pageName; + let entryName; + if (route.name) { + entryName = route.name; + pageName = route.name; + } else { + const dir = path.dirname(route.source); + pageName = path.parse(dir).name; + entryName = pageName.toLocaleLowerCase(); + } return { - path: route.path, - entryName: pageName.toLowerCase(), + entryPath: getPageEntryByAppJson(rootDir, route.source), + entryName, pageName, - entryPath: route.source.replace(/\/?pages/, ''), + source: route.source }; }); } -function getEntriesByDir(api: any) { +function getPageEntryByAppJson(rootDir, source) { + const absolutePath = path.resolve(rootDir, 'src', source); + const targetExt = ['ts', 'tsx', 'js', 'jsx'].find(ext => fs.existsSync(`${absolutePath}.${ext}`)); + if (!targetExt) { + throw new Error(`Cannot find target file ${absolutePath}.`); + } + return `${source}.${targetExt}`; +} + +function getEntriesByDir(api: any): IEntry[] { const { context: { rootDir }, } = api; @@ -43,18 +71,18 @@ function getEntriesByDir(api: any) { const entries = pages.map((pageName) => { const entryName = pageName.toLocaleLowerCase(); - const pageEntry = getPageEntry(pagesPath, pageName); + const pageEntry = getPageEntryByDir(pagesPath, pageName); if (!pageEntry) return null; return { entryName, pageName, - entryPath: `${pageName}/${pageEntry}`, + entryPath: `pages/${pageName}/${pageEntry}`, }; }).filter(Boolean); return entries; } -function getPageEntry(pagesPath: string, pageName: string) { +function getPageEntryByDir(pagesPath: string, pageName: string) { const pagePath = path.join(pagesPath, pageName); const pageRootFiles = fs.readdirSync(pagePath); const appRegexp = /^app\.(t|j)sx?$/; diff --git a/packages/build-app-helpers/src/getRoutesByAppJson.ts b/packages/build-app-helpers/src/getRoutesByAppJson.ts index 14bc177192..3760394742 100644 --- a/packages/build-app-helpers/src/getRoutesByAppJson.ts +++ b/packages/build-app-helpers/src/getRoutesByAppJson.ts @@ -4,6 +4,7 @@ interface IRoute { targets?: string[]; source: string; path: string; + name?: string; } interface IStaticConfig { routes: IRoute[]; diff --git a/packages/build-app-helpers/src/index.ts b/packages/build-app-helpers/src/index.ts index 287aa56283..377ade078c 100644 --- a/packages/build-app-helpers/src/index.ts +++ b/packages/build-app-helpers/src/index.ts @@ -4,4 +4,3 @@ export { default as formatPath } from './formatPath'; export { default as validation } from './validation'; export { default as unionBy } from './unionBy'; export { default as injectTransformRuntime } from './injectTransformRuntime'; - diff --git a/packages/build-mpa-config/package.json b/packages/build-mpa-config/package.json index 9ea6d6bcec..55ba8c69da 100644 --- a/packages/build-mpa-config/package.json +++ b/packages/build-mpa-config/package.json @@ -24,4 +24,4 @@ "loader-utils": "^2.0.0", "@builder/app-helpers": "^1.0.2" } -} \ No newline at end of file +} diff --git a/packages/build-mpa-config/src/generateEntry.ts b/packages/build-mpa-config/src/generateEntry.ts index 28e0702989..3df2ed90bc 100644 --- a/packages/build-mpa-config/src/generateEntry.ts +++ b/packages/build-mpa-config/src/generateEntry.ts @@ -6,8 +6,9 @@ function generateEntry({ framework, type, targetDir, pageEntry, entryName }) { // eslint-disable-next-line const entryCode = require(`./template/${framework}`).default({ type, resourcePath: `${formatPath(pageEntry)}`}); const entryFolder = path.join(targetDir, 'mpaEntry'); - ensureDirSync(entryFolder); const entryPath = path.join(entryFolder, `${entryName}.tsx`); + const entryDir = path.dirname(entryPath); + ensureDirSync(entryDir); writeFileSync(path.join(entryFolder, `${entryName}.tsx`), entryCode); return entryPath; } diff --git a/packages/build-mpa-config/src/index.ts b/packages/build-mpa-config/src/index.ts index 073fc2f143..cfb557116b 100644 --- a/packages/build-mpa-config/src/index.ts +++ b/packages/build-mpa-config/src/index.ts @@ -4,7 +4,6 @@ import generateEntry from './generateEntry'; interface IEntries { entryName: string; - pageName: string; entryPath: string; } @@ -32,7 +31,7 @@ export const generateMPAEntries = (options: IConfigOptions) => { const parsedEntries = {}; entries.forEach((entry) => { const { entryName, entryPath } = entry; - const pageEntry = path.join(rootDir, 'src/pages', entryPath); + const pageEntry = path.join(rootDir, 'src', entryPath); const useOriginEntry = /app\.(t|j)sx?$/.test(entryPath) || type === 'node'; // icejs will config entry by api modifyUserConfig @@ -64,11 +63,11 @@ const setMPAConfig = (config, options: IConfigOptions) => { const matchStrs = []; Object.keys(parsedEntries).forEach((entryKey) => { - const { entryName, pageName, finalEntry } = parsedEntries[entryKey]; + const { entryName, entryPath, finalEntry } = parsedEntries[entryKey]; config.entry(entryName).add(finalEntry); // get page paths for rule match - const matchStr = `src/pages/${pageName}`; + const matchStr = `src/${entryPath}`; matchStrs.push(formatPath(matchStr)); }); From 37bdf5524abf83d88b0ddc77953a2d0bf2ce42f5 Mon Sep 17 00:00:00 2001 From: Hengchang Lu <44047106+luhc228@users.noreply.github.com> Date: Fri, 11 Dec 2020 17:24:40 +0800 Subject: [PATCH 05/21] fix: store load time early (#3910) * fix: store load time early * chore: version * chore: version * chore: version * chore: remove APP_MODE from rax template * fix: move export --- packages/icejs/package.json | 6 +++--- packages/plugin-app-core/package.json | 4 ++-- .../src/generator/templates/app/rax/index.ts.ejs | 9 ++++----- .../generator/templates/app/react/index.ts.ejs | 15 ++++----------- .../src/generator/templates/common/appMode.ts.ejs | 3 +++ .../src/generator/templates/common/runApp.ts.ejs | 7 +++++++ packages/plugin-config/package.json | 2 +- packages/plugin-config/src/index.ts | 2 ++ 8 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 packages/plugin-app-core/src/generator/templates/common/appMode.ts.ejs diff --git a/packages/icejs/package.json b/packages/icejs/package.json index faa25c3a5c..7cf3aaaae0 100644 --- a/packages/icejs/package.json +++ b/packages/icejs/package.json @@ -22,9 +22,9 @@ }, "dependencies": { "@alib/build-scripts": "^0.1.13", - "build-plugin-app-core": "0.1.27", + "build-plugin-app-core": "0.1.28", "build-plugin-ice-auth": "1.7.2", - "build-plugin-ice-config": "1.7.1", + "build-plugin-ice-config": "1.7.2", "build-plugin-ice-helpers": "1.7.1", "build-plugin-ice-logger": "1.7.2", "build-plugin-ice-mpa": "1.8.1", @@ -47,4 +47,4 @@ "npm": ">=3.0.0" }, "gitHead": "cf40d079714b437417e77b444b078cf83286f2fc" -} \ No newline at end of file +} diff --git a/packages/plugin-app-core/package.json b/packages/plugin-app-core/package.json index f7fb54a639..c65a85eb7a 100644 --- a/packages/plugin-app-core/package.json +++ b/packages/plugin-app-core/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-app-core", - "version": "0.1.27", + "version": "0.1.28", "description": "the core plugin for icejs and raxjs.", "author": "ice-admin@alibaba-inc.com", "homepage": "", @@ -38,4 +38,4 @@ "url": "git@github.com:alibaba/ice.git" }, "gitHead": "07ac7bb07162aac8c90778dd1de4a2060f8df498" -} \ No newline at end of file +} diff --git a/packages/plugin-app-core/src/generator/templates/app/rax/index.ts.ejs b/packages/plugin-app-core/src/generator/templates/app/rax/index.ts.ejs index 02cfdf631e..80b401e6dc 100644 --- a/packages/plugin-app-core/src/generator/templates/app/rax/index.ts.ejs +++ b/packages/plugin-app-core/src/generator/templates/app/rax/index.ts.ejs @@ -1,8 +1,3 @@ -export * from './runApp'; -export { ErrorBoundary } from './ErrorBoundary'; -export * from './types'; -export const APP_MODE = (global as any).__app_mode__ || process.env.APP_MODE; - <%- imports %> <% if (exports) { %> @@ -10,3 +5,7 @@ export const APP_MODE = (global as any).__app_mode__ || process.env.APP_MODE; <%- exports %> } <% } %> + +export * from './runApp'; +export { ErrorBoundary } from './ErrorBoundary'; +export * from './types'; diff --git a/packages/plugin-app-core/src/generator/templates/app/react/index.ts.ejs b/packages/plugin-app-core/src/generator/templates/app/react/index.ts.ejs index 194fe498ec..3a104c908b 100644 --- a/packages/plugin-app-core/src/generator/templates/app/react/index.ts.ejs +++ b/packages/plugin-app-core/src/generator/templates/app/react/index.ts.ejs @@ -1,14 +1,3 @@ -import { runApp } from './runApp'; -export * from './runApp'; -export { lazy } from './lazy'; -export * from './types'; -export const APP_MODE = (global as any).__app_mode__ || process.env.APP_MODE; - -export function createApp(appConfig, staticConfig?: any) { - console.warn('Detected that you are using createApp, please use runApp method, Visit https://ice.work/docs/guide/basic/api.'); - runApp(appConfig, staticConfig) -} - <%- imports %> <% if (exports) { %> @@ -16,3 +5,7 @@ export function createApp(appConfig, staticConfig?: any) { <%- exports %> } <% } %> + +export * from './runApp'; +export { lazy } from './lazy'; +export * from './types'; diff --git a/packages/plugin-app-core/src/generator/templates/common/appMode.ts.ejs b/packages/plugin-app-core/src/generator/templates/common/appMode.ts.ejs new file mode 100644 index 0000000000..74bfc56834 --- /dev/null +++ b/packages/plugin-app-core/src/generator/templates/common/appMode.ts.ejs @@ -0,0 +1,3 @@ +const APP_MODE = (global as any).__app_mode__ || process.env.APP_MODE; + +export default APP_MODE; diff --git a/packages/plugin-app-core/src/generator/templates/common/runApp.ts.ejs b/packages/plugin-app-core/src/generator/templates/common/runApp.ts.ejs index 717ff82a64..84e354c06e 100644 --- a/packages/plugin-app-core/src/generator/templates/common/runApp.ts.ejs +++ b/packages/plugin-app-core/src/generator/templates/common/runApp.ts.ejs @@ -80,6 +80,13 @@ export function runApp(appConfig, staticConfig?: any) { }) }; +export function createApp(appConfig, staticConfig?: any) { + console.warn( + 'Detected that you are using createApp, please use runApp method, Visit https://ice.work/docs/guide/basic/api.' + ); + runApp(appConfig, staticConfig); +} + <% if (isReact) {%> const useSearchParams = () => { // @deprecated diff --git a/packages/plugin-config/package.json b/packages/plugin-config/package.json index 81bb4c3efc..fd18b1abd4 100644 --- a/packages/plugin-config/package.json +++ b/packages/plugin-config/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-ice-config", - "version": "1.7.1", + "version": "1.7.2", "description": "Define application config in icejs", "author": "ice-admin@alibaba-inc.com", "homepage": "", diff --git a/packages/plugin-config/src/index.ts b/packages/plugin-config/src/index.ts index 04242bdcfa..8b35597a82 100644 --- a/packages/plugin-config/src/index.ts +++ b/packages/plugin-config/src/index.ts @@ -23,6 +23,8 @@ const plugin: IPlugin = async (api): Promise => { applyMethod('removeIceExport', exportName); fse.removeSync(distPath); } + + applyMethod('addExport', { source: './appMode', exportName: 'APP_MODE' }); } generateConfig(); From f2922bc2cb8a34f920225f1256cde77d239ae745 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 10:19:05 +0800 Subject: [PATCH 06/21] refactor: add server bundle for ssr (#3909) --- packages/plugin-ice-ssr/src/server.ts.ejs | 3 +- packages/react-app-renderer/package.json | 2 +- packages/react-app-renderer/src/index.ts | 4 +- packages/react-app-renderer/src/renderer.tsx | 52 +++++++++----------- packages/react-app-renderer/src/server.tsx | 25 ++++++++++ 5 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 packages/react-app-renderer/src/server.tsx diff --git a/packages/plugin-ice-ssr/src/server.ts.ejs b/packages/plugin-ice-ssr/src/server.ts.ejs index a1d9eed119..48182d6a0d 100644 --- a/packages/plugin-ice-ssr/src/server.ts.ejs +++ b/packages/plugin-ice-ssr/src/server.ts.ejs @@ -2,7 +2,8 @@ import '@/app'; import * as cheerio from 'cheerio'; import * as queryString from 'query-string'; import { matchPath } from 'ice'; -import { reactAppRendererWithSSR, setInitialData } from 'react-app-renderer'; +import { setInitialData } from 'react-app-renderer'; +import reactAppRendererWithSSR from 'react-app-renderer/lib/server'; import { getAppConfig } from './appConfig'; import loadStaticModules from './loadStaticModules'; import app from './runApp'; diff --git a/packages/react-app-renderer/package.json b/packages/react-app-renderer/package.json index ef7a640c8d..3862da53ac 100644 --- a/packages/react-app-renderer/package.json +++ b/packages/react-app-renderer/package.json @@ -1,6 +1,6 @@ { "name": "react-app-renderer", - "version": "0.1.11", + "version": "1.0.0", "description": "", "author": "ice-admin@alibaba-inc.com", "homepage": "https://github.com/alibaba/ice#readme", diff --git a/packages/react-app-renderer/src/index.ts b/packages/react-app-renderer/src/index.ts index 50cd3e2619..68536bc1ae 100644 --- a/packages/react-app-renderer/src/index.ts +++ b/packages/react-app-renderer/src/index.ts @@ -1,4 +1,4 @@ -import { reactAppRenderer, reactAppRendererWithSSR, getInitialData, setInitialData } from './renderer'; +import { reactAppRenderer, getInitialData, setInitialData } from './renderer'; -export { reactAppRendererWithSSR, getInitialData, setInitialData }; +export { getInitialData, setInitialData }; export default reactAppRenderer; diff --git a/packages/react-app-renderer/src/renderer.tsx b/packages/react-app-renderer/src/renderer.tsx index 08caa16e14..4b5671863f 100644 --- a/packages/react-app-renderer/src/renderer.tsx +++ b/packages/react-app-renderer/src/renderer.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import * as ReactDOMServer from 'react-dom/server'; import { createNavigation } from 'create-app-container'; import { createUseRouter } from 'create-use-router'; import * as queryString from 'query-string'; @@ -10,12 +9,6 @@ const { createElement, useEffect, useState, Fragment, useLayoutEffect } = React; const useRouter = createUseRouter({ useState, useLayoutEffect }); const AppNavigation = createNavigation({ createElement, useEffect, useState, Fragment }); -export function reactAppRendererWithSSR(context, options) { - const { appConfig } = options || {}; - appConfig.router.type = 'static'; - return _renderApp(context, options); -} - let __initialData__; export function setInitialData(initialData) { @@ -65,32 +58,14 @@ export async function reactAppRenderer(options) { setInitialData(initialData); const context = { initialData, pageInitialProps, initialContext }; - _renderApp(context, options); + renderInBrowser(context, options); } -function _renderApp(context, options) { - const { appConfig, staticConfig = {}, buildConfig = {}, createBaseApp, emitLifeCycles } = options; - const { runtime, history, appConfig: modifiedAppConfig } = createBaseApp(appConfig, buildConfig, context); - - options.appConfig = modifiedAppConfig; - - // Emit app launch cycle - emitLifeCycles(); - - const isMobile = Object.keys(staticConfig).length; - if (isMobile) { - return _renderMobile({ runtime, history }, options); - } else { - return _render({ runtime }, options); - } -} - -function _render({ runtime }, options) { +export function getRenderApp(runtime, options) { const { ErrorBoundary, appConfig = {} } = options; const { ErrorBoundaryFallback, onErrorBoundaryHander, errorBoundary } = appConfig.app; const AppProvider = runtime?.composeAppProvider?.(); const AppRouter = runtime?.getAppRouter?.(); - const { rootId, mountNode } = appConfig.app; function App() { const appRouter = ; @@ -104,10 +79,29 @@ function _render({ runtime }, options) { } return rootApp; } + return App; +} + +function renderInBrowser(context, options) { + const { appConfig, staticConfig = {}, buildConfig = {}, createBaseApp, emitLifeCycles } = options; + const { runtime, history, appConfig: modifiedAppConfig } = createBaseApp(appConfig, buildConfig, context); + + options.appConfig = modifiedAppConfig; + // Emit app launch cycle + emitLifeCycles(); - if (process.env.__IS_SERVER__) { - return ReactDOMServer.renderToString(); + const isMobile = Object.keys(staticConfig).length; + if (isMobile) { + return _renderMobile({ runtime, history }, options); + } else { + return _render({ runtime }, options); } +} + +function _render({ runtime }, options) { + const { appConfig = {} } = options; + const { rootId, mountNode } = appConfig.app; + const App = getRenderApp(runtime, options); const appMountNode = _getAppMountNode(mountNode, rootId); if (runtime?.modifyDOMRender) { diff --git a/packages/react-app-renderer/src/server.tsx b/packages/react-app-renderer/src/server.tsx new file mode 100644 index 0000000000..497fe1b3d9 --- /dev/null +++ b/packages/react-app-renderer/src/server.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; +import * as ReactDOMServer from 'react-dom/server'; +import { getRenderApp } from './renderer'; + +function renderInServer(context, options) { + const { appConfig, buildConfig = {}, staticConfig = {}, createBaseApp, emitLifeCycles } = options; + const { runtime, appConfig: modifiedAppConfig } = createBaseApp(appConfig, buildConfig, context); + + options.appConfig = modifiedAppConfig; + // Emit app launch cycle + emitLifeCycles(); + const isMobile = Object.keys(staticConfig).length; + if (isMobile) { + // TODO: ssr is not support in mobile mode + return ''; + } + const App = getRenderApp(runtime, options); + return ReactDOMServer.renderToString(); +} + +export default function reactAppRendererWithSSR(context, options) { + const { appConfig } = options || {}; + appConfig.router.type = 'static'; + return renderInServer(context, options); +} From c15f7b3070f516c245b80fbcce14cf069fbeefea Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 10:20:08 +0800 Subject: [PATCH 07/21] fix: resolve path of build-plugin-load-assets (#3891) * fix: resolve path of build-plugin-load-assets * fix: load assets --- packages/plugin-load-assets/src/index.js | 19 ++++++++++--------- packages/plugin-smart-debug/src/index.js | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/plugin-load-assets/src/index.js b/packages/plugin-load-assets/src/index.js index 4cab982981..e4fae4712c 100644 --- a/packages/plugin-load-assets/src/index.js +++ b/packages/plugin-load-assets/src/index.js @@ -28,16 +28,17 @@ module.exports = ({ onGetWebpackConfig, log, context, getAllTask, ...restApi }, // compatible with dist output of component dev const ignoreTasks = ['component-dist']; taskNames.forEach((taskName) => { - if (ignoreTasks.includes(taskName)) { - return; - } onGetWebpackConfig(taskName, (config) => { - config.plugin('loadUrlWrapCodePlugin').tap(([options]) => [ - { ...options, - addCodeBefore: `window.assetsUrls = ${JSON.stringify(assetsUrls[command])}; - ${options.addCodeBefore || ''}`, - }, - ]); + if (ignoreTasks.includes(taskName)) { + config.plugins.delete('loadUrlWrapCodePlugin'); + } else { + config.plugin('loadUrlWrapCodePlugin').tap(([options]) => [ + { ...options, + addCodeBefore: `window.assetsUrls = ${JSON.stringify(assetsUrls[command])}; + ${options.addCodeBefore || ''}`, + }, + ]); + } }); }); } diff --git a/packages/plugin-smart-debug/src/index.js b/packages/plugin-smart-debug/src/index.js index 531944b164..3df32bb593 100644 --- a/packages/plugin-smart-debug/src/index.js +++ b/packages/plugin-smart-debug/src/index.js @@ -1,6 +1,6 @@ const path = require('path'); const buildPluginWrapCode = require('build-plugin-wrap-code'); -const getLoadScriptsCode = require('build-plugin-load-assets/getLoadScriptsCode'); +const getLoadScriptsCode = require('build-plugin-load-assets/lib/getLoadScriptsCode'); const getSmartLoaderCode = require('./getSmartLoaderCode'); module.exports = ({ onGetWebpackConfig, log, context, ...restApi }) => { From 9f4b3a9eb8f4e9e263d7d53c0eed6eea19dae530 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 10:48:47 +0800 Subject: [PATCH 08/21] refactor: support generator api for plugins (#3899) --- examples/basic-mpa/src/pages/Home/app.ts | 10 --- .../build-mpa-config/src/generateEntry.ts | 10 +-- packages/build-mpa-config/src/index.ts | 15 ++-- packages/build-mpa-config/src/template/rax.ts | 32 -------- .../build-mpa-config/src/template/rax.ts.ejs | 22 ++++++ .../src/template/{react.ts => react.ts.ejs} | 9 +-- packages/plugin-app-core/package.json | 3 +- .../src/config/setRegisterMethod.ts | 5 ++ .../plugin-app-core/src/generator/index.ts | 78 ++++++++++++------- packages/plugin-app-core/src/index.ts | 11 +-- packages/plugin-ice-ssr/package.json | 1 - packages/plugin-ice-ssr/src/index.ts | 11 +-- packages/plugin-mpa/src/index.ts | 2 +- packages/plugin-ssr/src/ssr/getBase.js | 2 +- packages/plugin-store/package.json | 2 - packages/plugin-store/src/generator.ts | 29 ++----- 16 files changed, 108 insertions(+), 134 deletions(-) delete mode 100644 examples/basic-mpa/src/pages/Home/app.ts delete mode 100644 packages/build-mpa-config/src/template/rax.ts create mode 100644 packages/build-mpa-config/src/template/rax.ts.ejs rename packages/build-mpa-config/src/template/{react.ts => react.ts.ejs} (76%) diff --git a/examples/basic-mpa/src/pages/Home/app.ts b/examples/basic-mpa/src/pages/Home/app.ts deleted file mode 100644 index 5272407b53..0000000000 --- a/examples/basic-mpa/src/pages/Home/app.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { runApp, IAppConfig } from 'ice'; -import Home from './index'; - -const appConfig: IAppConfig = { - router: { - routes: [{ path: '/', component: Home }], - }, -}; - -runApp(appConfig); diff --git a/packages/build-mpa-config/src/generateEntry.ts b/packages/build-mpa-config/src/generateEntry.ts index 3df2ed90bc..0faad8c006 100644 --- a/packages/build-mpa-config/src/generateEntry.ts +++ b/packages/build-mpa-config/src/generateEntry.ts @@ -1,15 +1,11 @@ import * as path from 'path'; import { formatPath } from '@builder/app-helpers'; -import { ensureDirSync, writeFileSync } from 'fs-extra'; -function generateEntry({ framework, type, targetDir, pageEntry, entryName }) { - // eslint-disable-next-line - const entryCode = require(`./template/${framework}`).default({ type, resourcePath: `${formatPath(pageEntry)}`}); +function generateEntry(api, { framework, targetDir, pageEntry, entryName }) { const entryFolder = path.join(targetDir, 'mpaEntry'); const entryPath = path.join(entryFolder, `${entryName}.tsx`); - const entryDir = path.dirname(entryPath); - ensureDirSync(entryDir); - writeFileSync(path.join(entryFolder, `${entryName}.tsx`), entryCode); + const templatePath = path.join(__dirname, `./template/${framework}.ts.ejs`); + api.applyMethod('addRenderFile', templatePath, entryPath, { resourcePath: `${formatPath(pageEntry.split('.').slice(0, -1).join('.'))}`}); return entryPath; } diff --git a/packages/build-mpa-config/src/index.ts b/packages/build-mpa-config/src/index.ts index cfb557116b..e862a460ac 100644 --- a/packages/build-mpa-config/src/index.ts +++ b/packages/build-mpa-config/src/index.ts @@ -8,17 +8,14 @@ interface IEntries { } interface IConfigOptions { - context: { - rootDir: string; - commandArgs: any; - }; type?: string; framework: string; entries?: IEntries[]; targetDir: string; } -export const generateMPAEntries = (options: IConfigOptions) => { - const { context, type = 'web', framework = 'rax', targetDir = '' } = options; +export const generateMPAEntries = (api, options: IConfigOptions) => { + const { context } = api; + const { type = 'web', framework = 'rax', targetDir = '' } = options; let { entries } = options; const { rootDir, commandArgs } = context; if (commandArgs.mpaEntry) { @@ -38,7 +35,7 @@ export const generateMPAEntries = (options: IConfigOptions) => { let finalEntry = pageEntry; if (!useOriginEntry) { // generate mpa entries - finalEntry = generateEntry({ framework, targetDir, type, pageEntry, entryName }); + finalEntry = generateEntry(api, { framework, targetDir, pageEntry, entryName }); } parsedEntries[entryName] = { ...entry, @@ -48,12 +45,12 @@ export const generateMPAEntries = (options: IConfigOptions) => { return parsedEntries; }; -const setMPAConfig = (config, options: IConfigOptions) => { +const setMPAConfig = (api, config, options: IConfigOptions) => { if (!options) { throw new Error('There need pass options param to setMPAConfig method'); } const { type = 'web' } = options; - const parsedEntries = generateMPAEntries(options); + const parsedEntries = generateMPAEntries(api, options); // do not splitChunks when mpa config.optimization.splitChunks({ cacheGroups: {} }); diff --git a/packages/build-mpa-config/src/template/rax.ts b/packages/build-mpa-config/src/template/rax.ts deleted file mode 100644 index 16ada645bb..0000000000 --- a/packages/build-mpa-config/src/template/rax.ts +++ /dev/null @@ -1,32 +0,0 @@ -export default ({ type, resourcePath }) => { - let appRender = ''; - if (['weex', 'kraken'].includes(type)) { - appRender = 'render(, null, { driver: DriverUniversal });'; - } else { - appRender = `const renderApp = async function() { - let comProps = {}; - // process App.getInitialProps - if (isSSR && window.__INITIAL_DATA__.pageData !== null) { - comProps = window.__INITIAL_DATA__.pageData; - } else if (Component.getInitialProps) { - const comProps = await Component.getInitialProps(); - } - render(, document.getElementById("root"), { driver: DriverUniversal, hydrate: isSSR }); -} -renderApp();`; - } - const source = `import { render, createElement } from 'rax'; -import Component from '${resourcePath}'; -import DriverUniversal from 'driver-universal'; - -const isSSR = window.__INITIAL_DATA__ && window.__INITIAL_DATA__.__SSR_ENABLED__; - -var comProps = {}; - -function Entry() { - return createElement(Component, comProps); -} -${appRender} -`; - return source; -}; diff --git a/packages/build-mpa-config/src/template/rax.ts.ejs b/packages/build-mpa-config/src/template/rax.ts.ejs new file mode 100644 index 0000000000..4a4bb053b7 --- /dev/null +++ b/packages/build-mpa-config/src/template/rax.ts.ejs @@ -0,0 +1,22 @@ +import { render, createElement } from 'rax'; +import Component from '<%- resourcePath %>'; +import DriverUniversal from 'driver-universal'; +import { isWeex, isKraken } from 'universal-env'; + +const isSSR = window.__INITIAL_DATA__ && window.__INITIAL_DATA__.__SSR_ENABLED__; + +if (isWeex || isKraken) { + render(, null, { driver: DriverUniversal }); +} else { + const renderApp = async function() { + let comProps = {}; + // process App.getInitialProps + if (isSSR && window.__INITIAL_DATA__.pageData !== null) { + comProps = window.__INITIAL_DATA__.pageData; + } else if (Component.getInitialProps) { + const comProps = await Component.getInitialProps(); + } + render(, document.getElementById("root"), { driver: DriverUniversal, hydrate: isSSR }); + } + renderApp(); +} \ No newline at end of file diff --git a/packages/build-mpa-config/src/template/react.ts b/packages/build-mpa-config/src/template/react.ts.ejs similarity index 76% rename from packages/build-mpa-config/src/template/react.ts rename to packages/build-mpa-config/src/template/react.ts.ejs index f46ff5726e..6a8f1aa4f8 100644 --- a/packages/build-mpa-config/src/template/react.ts +++ b/packages/build-mpa-config/src/template/react.ts.ejs @@ -1,7 +1,6 @@ -export default ({ resourcePath }) => { - const source = `import React from 'react'; +import React from 'react'; import ReactDOM from 'react-dom'; -import Component from '${resourcePath}'; +import Component from '<%- resourcePath %>'; function renderApp() { const isSSR = window.__ICE_SSR_ENABLED__; @@ -12,11 +11,9 @@ function renderApp() { } ReactDOM[isSSR ? 'hydrate' : 'render'](, document.getElementById('ice-container')); } + if (!Component) { console.warn('[icejs] You likely forget to export your component at ${resourcePath}'); } else { renderApp(); } -`; - return source; -}; diff --git a/packages/plugin-app-core/package.json b/packages/plugin-app-core/package.json index c65a85eb7a..97f127cac8 100644 --- a/packages/plugin-app-core/package.json +++ b/packages/plugin-app-core/package.json @@ -31,7 +31,8 @@ "rax-app-renderer": "^0.1.4", "rax-use-router": "^3.0.0", "react-app-renderer": "0.1.11", - "universal-env": "^3.0.0" + "universal-env": "^3.0.0", + "lodash.debounce": "^4.0.8" }, "repository": { "type": "git", diff --git a/packages/plugin-app-core/src/config/setRegisterMethod.ts b/packages/plugin-app-core/src/config/setRegisterMethod.ts index 55d6fcb17d..c2ba2ba415 100644 --- a/packages/plugin-app-core/src/config/setRegisterMethod.ts +++ b/packages/plugin-app-core/src/config/setRegisterMethod.ts @@ -18,6 +18,11 @@ export default (api, options) => { registerMethod('addPageExport', generator.addPageExport); registerMethod('removePageExport', generator.removePageExport); + // registerMethod for render content + registerMethod('addRenderFile', generator.addRenderFile); + registerMethod('addTemplateDir', generator.addTemplateDir); + registerMethod('modifyRenderData', generator.modifyRenderData); + // registerMethod for add export const apiKeys = getExportApiKeys(); apiKeys.forEach((apiKey) => { diff --git a/packages/plugin-app-core/src/generator/index.ts b/packages/plugin-app-core/src/generator/index.ts index 52cb5d0339..d2cc3a2e56 100644 --- a/packages/plugin-app-core/src/generator/index.ts +++ b/packages/plugin-app-core/src/generator/index.ts @@ -3,6 +3,7 @@ import * as fse from 'fs-extra'; import * as globby from 'globby'; import * as ejs from 'ejs'; import * as prettier from 'prettier'; +import * as debounce from 'lodash.debounce'; import generateExports from '../utils/generateExports'; import checkExportData from '../utils/checkExportData'; import removeExportData from '../utils/removeExportData'; @@ -21,13 +22,15 @@ interface IRenderFile { (templatePath: string, targetDir: string, extraData?: IRenderData): void; } +interface IRenderDataRegistration { + (renderDataFunction: IRenderData): IRenderData; +} -export default class Generator { - public templatesDir: string; +type IRenderTempalte = [string, string, IRenderData]; - public appTemplateDir: string; +const RENDER_WAIT = 500; - public commonTemplateDir: string; +export default class Generator { public targetDir: string; @@ -39,22 +42,24 @@ export default class Generator { private rootDir: string; + private renderTemplates: IRenderTempalte[]; + + private renderDataRegistration: IRenderDataRegistration[]; private log: any; private showPrettierError: boolean; - constructor({ rootDir, targetDir, templatesDir, appTemplateDir, commonTemplateDir, defaultData, log}) { + constructor({ rootDir, targetDir, defaultData, log}) { this.rootDir = rootDir; - this.templatesDir = templatesDir; - this.appTemplateDir = appTemplateDir; - this.commonTemplateDir = commonTemplateDir; this.targetDir = targetDir; this.renderData = defaultData; this.contentRegistration = {}; this.rerender = false; this.log = log; this.showPrettierError = true; + this.renderTemplates = []; + this.renderDataRegistration = []; } public addExport = (registerKey, exportData: IExportData | IExportData[]) => { @@ -112,7 +117,7 @@ export default class Generator { exportsData = Object.assign({}, exportsData, data); }); }); - this.renderData = { + return { ...this.renderData, ...exportsData, staticConfig: staticConfig.length && staticConfig[0], @@ -132,33 +137,48 @@ export default class Generator { }).join('\n'); } - public async render() { + public render = debounce(() => { this.rerender = true; - const appTemplates = await globby(['**/*'], { cwd: this.appTemplateDir }); - this.parseRenderData(); - appTemplates.forEach((templateFile) => { - this.renderAppTemplates(templateFile); + this.renderData = this.renderDataRegistration.reduce((previousValue, currentValue) => { + if (typeof currentValue === 'function') { + return currentValue(previousValue); + } + return previousValue; + }, this.parseRenderData()); + + this.renderTemplates.forEach((args) => { + this.renderFile(...args); }); + }, RENDER_WAIT); - this.renderCommonTemplates(); + public addRenderFile = (templatePath: string, targetPath: string, extraData: IRenderData = {}) => { + // check target path if it is already been registed + const targetTemplate = this.renderTemplates.find(([, templateTarget]) => templateTarget === targetPath); + if (targetTemplate) { + this.log.error('[template]', `path ${targetPath} already been rendered as file ${targetTemplate[0]}`); + } else { + this.renderTemplates.push([templatePath, targetPath, extraData]); + } + if (this.rerender) { + this.render(); + } } - public async renderAppTemplates(templateFile) { - this.renderFile( - path.join(this.appTemplateDir, templateFile), - path.join(this.targetDir, templateFile) - ); + public addTemplateDir = async (templateDir: string, extraData: IRenderData = {}) => { + const templates = await globby(['**/*'], { cwd: templateDir }); + templates.forEach((templateFile) => { + this.addRenderFile(path.join(templateDir, templateFile), path.join(this.targetDir, templateFile), extraData); + }); + if (this.rerender) { + this.render(); + } } - - public async renderCommonTemplates() { - const commonTemplates = await globby(['**/*'], { cwd: this.commonTemplateDir }); - commonTemplates.forEach((templateFile) => { - this.renderFile( - path.join(this.commonTemplateDir, templateFile), - path.join(this.targetDir, templateFile) - ); - }); + public async modifyRenderData(registration: IRenderDataRegistration) { + this.renderDataRegistration.push(registration); + if (this.rerender) { + this.render(); + } } public renderFile: IRenderFile = (templatePath, targetPath, extraData = {}) => { diff --git a/packages/plugin-app-core/src/index.ts b/packages/plugin-app-core/src/index.ts index a5f679a6a1..924300eb8e 100644 --- a/packages/plugin-app-core/src/index.ts +++ b/packages/plugin-app-core/src/index.ts @@ -1,4 +1,3 @@ - import * as path from 'path'; import Generator from './generator'; import getRuntimeModules from './utils/getRuntimeModules'; @@ -44,6 +43,12 @@ export default (api, options) => { // register api method const generator = initGenerator(api, { ...options, debugRuntime: commandArgs.debugRuntime }); setRegisterMethod(api, { generator }); + + // add core template for framework + const templateRoot = path.join(__dirname, './generator/templates'); + [`./app/${framework}`, './common'].forEach((templateDir) => { + generator.addTemplateDir(path.join(templateRoot, templateDir)); + }); // watch src folder if (command === 'start') { @@ -61,16 +66,12 @@ function initGenerator(api, options) { const { userConfig, rootDir } = context; const { framework, debugRuntime } = options; const plugins = getAllPlugin(); - const templatesDir = path.join(__dirname, './generator/templates'); const { targets = [] } = userConfig; const isMiniapp = targets.includes('miniapp') || targets.includes('wechat-miniprogram') || targets.includes('bytedance-microapp'); const targetDir = getValue(TEMP_PATH); return new Generator({ rootDir, targetDir, - templatesDir, - appTemplateDir: path.join(templatesDir, `./app/${framework}`), - commonTemplateDir: path.join(templatesDir, './common'), defaultData: { framework, isReact: framework === 'react', diff --git a/packages/plugin-ice-ssr/package.json b/packages/plugin-ice-ssr/package.json index 6e0326d333..72a171aebf 100644 --- a/packages/plugin-ice-ssr/package.json +++ b/packages/plugin-ice-ssr/package.json @@ -25,7 +25,6 @@ "build-scripts-config": "^0.1.6", "chalk": "^4.0.0", "cheerio": "^1.0.0-rc.3", - "ejs": "^3.0.1", "fs-extra": "^8.1.0", "html-minifier": "^4.0.0", "parseurl": "^1.3.3", diff --git a/packages/plugin-ice-ssr/src/index.ts b/packages/plugin-ice-ssr/src/index.ts index 181977c1d7..8caf4bb126 100644 --- a/packages/plugin-ice-ssr/src/index.ts +++ b/packages/plugin-ice-ssr/src/index.ts @@ -1,24 +1,21 @@ import * as path from 'path'; import * as fse from 'fs-extra'; -import * as ejs from 'ejs'; import { minify } from 'html-minifier'; import { getWebpackConfig } from 'build-scripts-config'; const plugin = async (api): Promise => { - const { context, registerTask, getValue, onGetWebpackConfig, onHook, log } = api; + const { context, registerTask, getValue, onGetWebpackConfig, onHook, log, applyMethod } = api; const { rootDir, command, webpack, userConfig, commandArgs } = context; const TEMP_PATH = getValue('TEMP_PATH'); - const ssrEntry = path.join(TEMP_PATH, 'server.ts'); // Note: Compatible plugins to modify configuration const buildDir = path.join(rootDir, userConfig.outputDir); const serverDir = path.join(buildDir, 'server'); const serverFilename = 'index.js'; + // render server entry const templatePath = path.join(__dirname, '../src/server.ts.ejs'); - const templateContent = fse.readFileSync(templatePath, 'utf-8'); - const content = ejs.render(templateContent); - fse.ensureDirSync(path.dirname(ssrEntry)); - fse.writeFileSync(ssrEntry, content, 'utf-8'); + const ssrEntry = path.join(TEMP_PATH, 'server.ts'); + applyMethod('addRenderFile', templatePath, ssrEntry); const mode = command === 'start' ? 'development' : 'production'; const webpackConfig = getWebpackConfig(mode); diff --git a/packages/plugin-mpa/src/index.ts b/packages/plugin-mpa/src/index.ts index ed174fd3b8..59f38cf28f 100644 --- a/packages/plugin-mpa/src/index.ts +++ b/packages/plugin-mpa/src/index.ts @@ -58,7 +58,7 @@ const plugin: IPlugin = (api) => { // compatible with undefined TEMP_PATH // if disableRuntime is true, do not generate mpa entries if (getValue('TEMP_PATH')) { - parsedEntries = generateMPAEntries({ context, entries: mpaEntries, framework: 'react', targetDir: getValue('TEMP_PATH') }); + parsedEntries = generateMPAEntries(api, { entries: mpaEntries, framework: 'react', targetDir: getValue('TEMP_PATH') }); } let finalMPAEntries = {}; if (parsedEntries) { diff --git a/packages/plugin-ssr/src/ssr/getBase.js b/packages/plugin-ssr/src/ssr/getBase.js index 526f5e5952..7e823266d7 100644 --- a/packages/plugin-ssr/src/ssr/getBase.js +++ b/packages/plugin-ssr/src/ssr/getBase.js @@ -32,7 +32,7 @@ module.exports = (api) => { let entries = {}; if (webConfig.mpa) { - setMPAConfig.default(config, { context, type: TARGET, entries: getMpaEntries(api, { target: 'web', appJsonPath }) }); + setMPAConfig.default(api, config, { type: TARGET, entries: getMpaEntries(api, { target: 'web', appJsonPath }) }); const mpaEntries = config.toConfig().entry; entries = Object.keys(mpaEntries).map(entryName => { return { diff --git a/packages/plugin-store/package.json b/packages/plugin-store/package.json index 20048f8d55..dee089a121 100644 --- a/packages/plugin-store/package.json +++ b/packages/plugin-store/package.json @@ -23,12 +23,10 @@ }, "dependencies": { "@ice/store": "^1.3.1", - "ejs": "^3.0.2", "enhanced-resolve": "^4.3.0", "fs-extra": "^8.1.0", "fs-readdir-recursive": "^1.1.0", "loader-utils": "^2.0.0", - "prettier": "^2.0.4", "rax-redux": "^1.0.0" } } \ No newline at end of file diff --git a/packages/plugin-store/src/generator.ts b/packages/plugin-store/src/generator.ts index 18e05087b3..055f0c833e 100644 --- a/packages/plugin-store/src/generator.ts +++ b/packages/plugin-store/src/generator.ts @@ -1,8 +1,6 @@ import * as path from 'path'; import * as fse from 'fs-extra'; -import * as ejs from 'ejs'; import * as recursiveReaddir from 'fs-readdir-recursive'; -import * as prettier from 'prettier'; export interface IRenderPageParams { pageName: string; @@ -129,7 +127,7 @@ export default class Generator { appStoreImport: `import store from '${appStoreFile.replace(`.${this.projectType}`, '')}'` }; - this.renderFile(this.appStoreTemplatePath, targetPath, appStoreRenderData); + this.applyMethod('addRenderFile', this.appStoreTemplatePath, targetPath, appStoreRenderData); this.applyMethod('removeExport', exportName); this.applyMethod('addExport', { source: `./${sourceFilename}`, specifier: 'store', exportName }); } @@ -142,7 +140,7 @@ export default class Generator { existsAppStoreFile }; - this.renderFile(this.typesTemplatePath, targetPath, appStoreTypesRenderData); + this.applyMethod('addRenderFile', this.typesTemplatePath, targetPath, appStoreTypesRenderData); this.applyMethod('addTypesExport', { source: './store/types' }); } @@ -154,7 +152,7 @@ export default class Generator { const pageModelFilePath = path.join(pageNameDir, 'model'); const renderData = this.getPageModels(pageName, pageModelsDir, pageModelFilePath); - this.renderFile(this.pageStoreTemplatePath, targetPath, renderData); + this.applyMethod('addRenderFile', this.pageStoreTemplatePath, targetPath, renderData); this.applyMethod('removePageExport', pageName, exportName); this.applyMethod('addPageExport', pageName, { source: `./${sourceFilename}`, exportName }); @@ -179,7 +177,7 @@ export default class Generator { pageComponentRenderData.hasPageStore = true; } - this.renderFile(pageComponentTemplatePath, pageComponentTargetPath, pageComponentRenderData); + this.applyMethod('addRenderFile', pageComponentTemplatePath, pageComponentTargetPath, pageComponentRenderData); } private renderPageLayout({ pageName, pageNameDir, pageModelsDir, pageModelFile, pageStoreFile, existedStoreFile }: IRenderPageParams) { @@ -204,7 +202,7 @@ export default class Generator { pageLayoutRenderData.hasPageStore = true; } - this.renderFile(pageComponentTemplatePath, pageComponentTargetPath, pageLayoutRenderData); + this.applyMethod('addRenderFile', pageComponentTemplatePath, pageComponentTargetPath, pageLayoutRenderData); } private renderPageIndex(params) { @@ -219,22 +217,7 @@ export default class Generator { pageExports: (existsModel && !existedStoreFile) ? ' store ' : '' }; - this.renderFile(pageIndexTemplatePath, pageComponentTargetPath, pageComponentRenderData); - } - - private renderFile(templatePath: string, targetPath: string, extraData = {}) { - const templateContent = fse.readFileSync(templatePath, 'utf-8'); - let content = ejs.render(templateContent, { ...extraData }); - try { - content = prettier.format(content, { - parser: 'typescript', - singleQuote: true - }); - } catch (error) { - // ignore error - } - fse.ensureDirSync(path.dirname(targetPath)); - fse.writeFileSync(targetPath, content, 'utf-8'); + this.applyMethod('addRenderFile', pageIndexTemplatePath, pageComponentTargetPath, pageComponentRenderData); } public render() { From a3446fa07a377ea61719edeabd22ccd8e59fe7d4 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 10:53:33 +0800 Subject: [PATCH 09/21] feat: support color names (#3914) * feat: support color names * fix: match transparent --- packages/plugin-fusion/CHANGELOG.md | 8 + .../plugin-fusion/src/utils/colorNames.js | 156 ++++++++++++++++++ .../plugin-fusion/src/utils/getThemeVars.js | 3 +- 3 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 packages/plugin-fusion/src/utils/colorNames.js diff --git a/packages/plugin-fusion/CHANGELOG.md b/packages/plugin-fusion/CHANGELOG.md index 02d43783bf..25e50789c7 100644 --- a/packages/plugin-fusion/CHANGELOG.md +++ b/packages/plugin-fusion/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.2.0 + +- [feat] support color names + +## 0.1.9 + +- [fix] compatible with component dist build + ## 0.1.8 - [feat] support `componentOptions` to load h5 component in mobile mode - [feat] support option `px2vwOptions` to pass options to postcssPlugin diff --git a/packages/plugin-fusion/src/utils/colorNames.js b/packages/plugin-fusion/src/utils/colorNames.js new file mode 100644 index 0000000000..6272b6e85e --- /dev/null +++ b/packages/plugin-fusion/src/utils/colorNames.js @@ -0,0 +1,156 @@ +// Big List of Colors +// ------------------ +// +const colorNames = { + aliceblue: 'f0f8ff', + antiquewhite: 'faebd7', + aqua: '0ff', + aquamarine: '7fffd4', + azure: 'f0ffff', + beige: 'f5f5dc', + bisque: 'ffe4c4', + black: '000', + blanchedalmond: 'ffebcd', + blue: '00f', + blueviolet: '8a2be2', + brown: 'a52a2a', + burlywood: 'deb887', + burntsienna: 'ea7e5d', + cadetblue: '5f9ea0', + chartreuse: '7fff00', + chocolate: 'd2691e', + coral: 'ff7f50', + cornflowerblue: '6495ed', + cornsilk: 'fff8dc', + crimson: 'dc143c', + cyan: '0ff', + darkblue: '00008b', + darkcyan: '008b8b', + darkgoldenrod: 'b8860b', + darkgray: 'a9a9a9', + darkgreen: '006400', + darkgrey: 'a9a9a9', + darkkhaki: 'bdb76b', + darkmagenta: '8b008b', + darkolivegreen: '556b2f', + darkorange: 'ff8c00', + darkorchid: '9932cc', + darkred: '8b0000', + darksalmon: 'e9967a', + darkseagreen: '8fbc8f', + darkslateblue: '483d8b', + darkslategray: '2f4f4f', + darkslategrey: '2f4f4f', + darkturquoise: '00ced1', + darkviolet: '9400d3', + deeppink: 'ff1493', + deepskyblue: '00bfff', + dimgray: '696969', + dimgrey: '696969', + dodgerblue: '1e90ff', + firebrick: 'b22222', + floralwhite: 'fffaf0', + forestgreen: '228b22', + fuchsia: 'f0f', + gainsboro: 'dcdcdc', + ghostwhite: 'f8f8ff', + gold: 'ffd700', + goldenrod: 'daa520', + gray: '808080', + green: '008000', + greenyellow: 'adff2f', + grey: '808080', + honeydew: 'f0fff0', + hotpink: 'ff69b4', + indianred: 'cd5c5c', + indigo: '4b0082', + ivory: 'fffff0', + khaki: 'f0e68c', + lavender: 'e6e6fa', + lavenderblush: 'fff0f5', + lawngreen: '7cfc00', + lemonchiffon: 'fffacd', + lightblue: 'add8e6', + lightcoral: 'f08080', + lightcyan: 'e0ffff', + lightgoldenrodyellow: 'fafad2', + lightgray: 'd3d3d3', + lightgreen: '90ee90', + lightgrey: 'd3d3d3', + lightpink: 'ffb6c1', + lightsalmon: 'ffa07a', + lightseagreen: '20b2aa', + lightskyblue: '87cefa', + lightslategray: '789', + lightslategrey: '789', + lightsteelblue: 'b0c4de', + lightyellow: 'ffffe0', + lime: '0f0', + limegreen: '32cd32', + linen: 'faf0e6', + magenta: 'f0f', + maroon: '800000', + mediumaquamarine: '66cdaa', + mediumblue: '0000cd', + mediumorchid: 'ba55d3', + mediumpurple: '9370db', + mediumseagreen: '3cb371', + mediumslateblue: '7b68ee', + mediumspringgreen: '00fa9a', + mediumturquoise: '48d1cc', + mediumvioletred: 'c71585', + midnightblue: '191970', + mintcream: 'f5fffa', + mistyrose: 'ffe4e1', + moccasin: 'ffe4b5', + navajowhite: 'ffdead', + navy: '000080', + oldlace: 'fdf5e6', + olive: '808000', + olivedrab: '6b8e23', + orange: 'ffa500', + orangered: 'ff4500', + orchid: 'da70d6', + palegoldenrod: 'eee8aa', + palegreen: '98fb98', + paleturquoise: 'afeeee', + palevioletred: 'db7093', + papayawhip: 'ffefd5', + peachpuff: 'ffdab9', + peru: 'cd853f', + pink: 'ffc0cb', + plum: 'dda0dd', + powderblue: 'b0e0e6', + purple: '800080', + rebeccapurple: '663399', + red: 'f00', + rosybrown: 'bc8f8f', + royalblue: '4169e1', + saddlebrown: '8b4513', + salmon: 'fa8072', + sandybrown: 'f4a460', + seagreen: '2e8b57', + seashell: 'fff5ee', + sienna: 'a0522d', + silver: 'c0c0c0', + skyblue: '87ceeb', + slateblue: '6a5acd', + slategray: '708090', + slategrey: '708090', + snow: 'fffafa', + springgreen: '00ff7f', + steelblue: '4682b4', + tan: 'd2b48c', + teal: '008080', + thistle: 'd8bfd8', + tomato: 'ff6347', + turquoise: '40e0d0', + violet: 'ee82ee', + wheat: 'f5deb3', + white: 'fff', + whitesmoke: 'f5f5f5', + yellow: 'ff0', + yellowgreen: '9acd32' +}; + +module.exports = colorNames; \ No newline at end of file diff --git a/packages/plugin-fusion/src/utils/getThemeVars.js b/packages/plugin-fusion/src/utils/getThemeVars.js index 3d429013c8..52c816331d 100644 --- a/packages/plugin-fusion/src/utils/getThemeVars.js +++ b/packages/plugin-fusion/src/utils/getThemeVars.js @@ -1,5 +1,6 @@ /* eslint no-useless-escape:0 */ const fs = require('fs'); +const colorNames = require('./colorNames'); module.exports = (themeFile, themeConfig) => { const themeVars = {}; @@ -23,7 +24,7 @@ module.exports = (themeFile, themeConfig) => { originTheme[themeKey.slice(1)] = themeVars[themeKey]; const themeValue = themeVars[themeKey]; - if (themeValue && (themeValue.indexOf('#') !== 0 && !themeValue.match(/^rgb/) || ['$color-white', '$color-black'].indexOf(themeKey) > -1)) { + if (themeValue && (themeValue.indexOf('#') !== 0 && !themeValue.match(/^(rgb|transparent)/) && !colorNames[themeValue] || ['$color-white', '$color-black'].indexOf(themeKey) > -1)) { delete themeVars[themeKey]; } }); From 5bd7a579d4ae336145f73fcf3772c323f81e8edc Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 11:20:49 +0800 Subject: [PATCH 10/21] chore: version --- packages/build-app-helpers/package.json | 4 ++-- packages/build-mpa-config/package.json | 6 +++--- packages/eslint-reporting-webpack-plugin/package.json | 2 +- packages/icejs/package.json | 8 ++++---- packages/plugin-app-core/package.json | 4 ++-- packages/plugin-config/package.json | 2 +- packages/plugin-fusion/package.json | 2 +- packages/plugin-ice-ssr/package.json | 2 +- packages/plugin-load-assets/package.json | 2 +- packages/plugin-mpa/package.json | 6 +++--- packages/plugin-smart-debug/package.json | 4 ++-- packages/plugin-ssr/package.json | 8 ++++---- packages/plugin-store/package.json | 2 +- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/build-app-helpers/package.json b/packages/build-app-helpers/package.json index 0a9f6204c7..520c97bbad 100644 --- a/packages/build-app-helpers/package.json +++ b/packages/build-app-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@builder/app-helpers", - "version": "1.0.2", + "version": "1.0.3", "description": "build helpers for app framework", "author": "ice-admin@alibaba-inc.com", "homepage": "", @@ -23,4 +23,4 @@ "fs-extra": "^8.1.0", "lodash": "^4.17.20" } -} +} \ No newline at end of file diff --git a/packages/build-mpa-config/package.json b/packages/build-mpa-config/package.json index 55ba8c69da..4a4e51edec 100644 --- a/packages/build-mpa-config/package.json +++ b/packages/build-mpa-config/package.json @@ -1,6 +1,6 @@ { "name": "@builder/mpa-config", - "version": "1.1.1", + "version": "2.0.0", "description": "enable mpa project for framework", "author": "ice-admin@alibaba-inc.com", "homepage": "", @@ -22,6 +22,6 @@ "dependencies": { "fs-extra": "^8.1.0", "loader-utils": "^2.0.0", - "@builder/app-helpers": "^1.0.2" + "@builder/app-helpers": "^1.0.3" } -} +} \ No newline at end of file diff --git a/packages/eslint-reporting-webpack-plugin/package.json b/packages/eslint-reporting-webpack-plugin/package.json index 36f6b0df0b..682f271d72 100644 --- a/packages/eslint-reporting-webpack-plugin/package.json +++ b/packages/eslint-reporting-webpack-plugin/package.json @@ -19,4 +19,4 @@ "plugin", "webpack" ] -} +} \ No newline at end of file diff --git a/packages/icejs/package.json b/packages/icejs/package.json index 7cf3aaaae0..876201e8ff 100644 --- a/packages/icejs/package.json +++ b/packages/icejs/package.json @@ -27,11 +27,11 @@ "build-plugin-ice-config": "1.7.2", "build-plugin-ice-helpers": "1.7.1", "build-plugin-ice-logger": "1.7.2", - "build-plugin-ice-mpa": "1.8.1", + "build-plugin-ice-mpa": "1.8.2", "build-plugin-ice-request": "1.7.2", "build-plugin-ice-router": "1.7.6", - "build-plugin-ice-ssr": "1.7.8", - "build-plugin-ice-store": "1.7.10", + "build-plugin-ice-ssr": "1.7.9", + "build-plugin-ice-store": "1.7.11", "build-plugin-react-app": "1.7.12", "build-plugin-miniapp": "0.1.7", "chalk": "^4.1.0", @@ -47,4 +47,4 @@ "npm": ">=3.0.0" }, "gitHead": "cf40d079714b437417e77b444b078cf83286f2fc" -} +} \ No newline at end of file diff --git a/packages/plugin-app-core/package.json b/packages/plugin-app-core/package.json index 97f127cac8..7d7c491078 100644 --- a/packages/plugin-app-core/package.json +++ b/packages/plugin-app-core/package.json @@ -30,7 +30,7 @@ "query-string": "^6.13.1", "rax-app-renderer": "^0.1.4", "rax-use-router": "^3.0.0", - "react-app-renderer": "0.1.11", + "react-app-renderer": "1.0.0", "universal-env": "^3.0.0", "lodash.debounce": "^4.0.8" }, @@ -39,4 +39,4 @@ "url": "git@github.com:alibaba/ice.git" }, "gitHead": "07ac7bb07162aac8c90778dd1de4a2060f8df498" -} +} \ No newline at end of file diff --git a/packages/plugin-config/package.json b/packages/plugin-config/package.json index fd18b1abd4..24cec571f7 100644 --- a/packages/plugin-config/package.json +++ b/packages/plugin-config/package.json @@ -29,4 +29,4 @@ "@alib/build-scripts": "^0.1.24", "@types/fs-extra": "^8.1.0" } -} +} \ No newline at end of file diff --git a/packages/plugin-fusion/package.json b/packages/plugin-fusion/package.json index 0993d571e1..f3b58040b1 100644 --- a/packages/plugin-fusion/package.json +++ b/packages/plugin-fusion/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-fusion", - "version": "0.1.9", + "version": "0.1.10", "description": "plugin for build scripts while use fusion component", "main": "lib/index.js", "scripts": { diff --git a/packages/plugin-ice-ssr/package.json b/packages/plugin-ice-ssr/package.json index 72a171aebf..67bd056734 100644 --- a/packages/plugin-ice-ssr/package.json +++ b/packages/plugin-ice-ssr/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-ice-ssr", - "version": "1.7.8", + "version": "1.7.9", "description": "ssr plugin", "author": "ice-admin@alibaba-inc.com", "homepage": "", diff --git a/packages/plugin-load-assets/package.json b/packages/plugin-load-assets/package.json index 09d20409a5..1f7819d618 100644 --- a/packages/plugin-load-assets/package.json +++ b/packages/plugin-load-assets/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-load-assets", - "version": "0.1.2", + "version": "0.1.3", "description": "build plugin for load assets", "main": "lib/index.js", "scripts": { diff --git a/packages/plugin-mpa/package.json b/packages/plugin-mpa/package.json index 1b260bdad5..b3b4bb28bd 100644 --- a/packages/plugin-mpa/package.json +++ b/packages/plugin-mpa/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-ice-mpa", - "version": "1.8.1", + "version": "1.8.2", "description": "enable mpa project for icejs framework", "author": "ice-admin@alibaba-inc.com", "homepage": "", @@ -23,8 +23,8 @@ "@alib/build-scripts": "^0.1.24" }, "dependencies": { - "@builder/app-helpers": "^1.0.2", - "@builder/mpa-config": "^1.1.0", + "@builder/app-helpers": "^1.0.3", + "@builder/mpa-config": "^2.0.0", "fs-extra": "^8.1.0" } } \ No newline at end of file diff --git a/packages/plugin-smart-debug/package.json b/packages/plugin-smart-debug/package.json index e89a7cb58b..f0dc05b76e 100644 --- a/packages/plugin-smart-debug/package.json +++ b/packages/plugin-smart-debug/package.json @@ -9,7 +9,7 @@ "author": "", "license": "ISC", "dependencies": { - "build-plugin-load-assets": "^0.1.0", + "build-plugin-load-assets": "^0.1.3", "build-plugin-wrap-code": "^0.1.0" } -} +} \ No newline at end of file diff --git a/packages/plugin-ssr/package.json b/packages/plugin-ssr/package.json index c77fd5a4d3..3b3aa270f3 100644 --- a/packages/plugin-ssr/package.json +++ b/packages/plugin-ssr/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-ssr", - "version": "1.0.6", + "version": "1.0.7", "description": "", "author": "", "homepage": "https://github.com/alibaba/ice#readme", @@ -24,12 +24,12 @@ "url": "https://github.com/alibaba/ice/issues" }, "dependencies": { - "@builder/mpa-config": "^1.0.0", + "@builder/mpa-config": "^2.0.0", "chalk": "^4.1.0", "fs-extra": "^9.0.1", "error-stack-tracey": "^0.1.3", "qs": "^6.9.4", - "@builder/app-helpers": "^1.0.0", + "@builder/app-helpers": "^1.0.3", "react-dev-utils": "^10.0.0" } -} +} \ No newline at end of file diff --git a/packages/plugin-store/package.json b/packages/plugin-store/package.json index dee089a121..47a20c7d66 100644 --- a/packages/plugin-store/package.json +++ b/packages/plugin-store/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-ice-store", - "version": "1.7.10", + "version": "1.7.11", "description": "builtin `icestore` in icejs", "author": "ice-admin@alibaba-inc.com", "homepage": "", From 33066a2e715c0a1617060615e9cf2853254cec37 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 13:23:07 +0800 Subject: [PATCH 11/21] fix: generator error message --- packages/plugin-app-core/src/generator/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/plugin-app-core/src/generator/index.ts b/packages/plugin-app-core/src/generator/index.ts index d2cc3a2e56..27eadea83f 100644 --- a/packages/plugin-app-core/src/generator/index.ts +++ b/packages/plugin-app-core/src/generator/index.ts @@ -153,9 +153,11 @@ export default class Generator { public addRenderFile = (templatePath: string, targetPath: string, extraData: IRenderData = {}) => { // check target path if it is already been registed - const targetTemplate = this.renderTemplates.find(([, templateTarget]) => templateTarget === targetPath); + const targetTemplate = this.renderTemplates.findIndex(([, templateTarget]) => templateTarget === targetPath); if (targetTemplate) { - this.log.error('[template]', `path ${targetPath} already been rendered as file ${targetTemplate[0]}`); + if (targetTemplate[0] !== templatePath) { + this.log.error('[template]', `path ${targetPath} already been rendered as file ${targetTemplate[0]}`); + } } else { this.renderTemplates.push([templatePath, targetPath, extraData]); } From c760f0190ca0762972370faf67be5e3710a06613 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 13:39:40 +0800 Subject: [PATCH 12/21] fix: generator debounce --- .../plugin-app-core/src/generator/index.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/plugin-app-core/src/generator/index.ts b/packages/plugin-app-core/src/generator/index.ts index 27eadea83f..e7465d976d 100644 --- a/packages/plugin-app-core/src/generator/index.ts +++ b/packages/plugin-app-core/src/generator/index.ts @@ -137,7 +137,7 @@ export default class Generator { }).join('\n'); } - public render = debounce(() => { + public render = () => { this.rerender = true; this.renderData = this.renderDataRegistration.reduce((previousValue, currentValue) => { if (typeof currentValue === 'function') { @@ -149,20 +149,25 @@ export default class Generator { this.renderTemplates.forEach((args) => { this.renderFile(...args); }); - }, RENDER_WAIT); + }; + + public debounceRender = debounce(this.render, RENDER_WAIT); public addRenderFile = (templatePath: string, targetPath: string, extraData: IRenderData = {}) => { // check target path if it is already been registed - const targetTemplate = this.renderTemplates.findIndex(([, templateTarget]) => templateTarget === targetPath); - if (targetTemplate) { + const renderIndex = this.renderTemplates.findIndex(([, templateTarget]) => templateTarget === targetPath); + if (renderIndex > -1) { + const targetTemplate = this.renderTemplates[renderIndex]; if (targetTemplate[0] !== templatePath) { this.log.error('[template]', `path ${targetPath} already been rendered as file ${targetTemplate[0]}`); } + // replace template with lastest content + this.renderTemplates[renderIndex] = [templatePath, targetPath, extraData]; } else { this.renderTemplates.push([templatePath, targetPath, extraData]); } if (this.rerender) { - this.render(); + this.debounceRender(); } } @@ -172,14 +177,14 @@ export default class Generator { this.addRenderFile(path.join(templateDir, templateFile), path.join(this.targetDir, templateFile), extraData); }); if (this.rerender) { - this.render(); + this.debounceRender(); } } public async modifyRenderData(registration: IRenderDataRegistration) { this.renderDataRegistration.push(registration); if (this.rerender) { - this.render(); + this.debounceRender(); } } From 8665266d1643ef3c8d7398dc167add87f335db28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8B=92=E7=8B=92=E7=A5=9E?= Date: Mon, 14 Dec 2020 14:27:02 +0800 Subject: [PATCH 13/21] feat: define hydrate value when build (#3918) * feat: define hydrate value when build * chore: optimize code --- packages/build-mpa-config/src/generateEntry.ts | 6 +++++- packages/build-mpa-config/src/template/rax.ts.ejs | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/build-mpa-config/src/generateEntry.ts b/packages/build-mpa-config/src/generateEntry.ts index 0faad8c006..dc79efed69 100644 --- a/packages/build-mpa-config/src/generateEntry.ts +++ b/packages/build-mpa-config/src/generateEntry.ts @@ -2,10 +2,14 @@ import * as path from 'path'; import { formatPath } from '@builder/app-helpers'; function generateEntry(api, { framework, targetDir, pageEntry, entryName }) { + const { context: { userConfig: { web: webConfig = {} } } } = api; const entryFolder = path.join(targetDir, 'mpaEntry'); const entryPath = path.join(entryFolder, `${entryName}.tsx`); const templatePath = path.join(__dirname, `./template/${framework}.ts.ejs`); - api.applyMethod('addRenderFile', templatePath, entryPath, { resourcePath: `${formatPath(pageEntry.split('.').slice(0, -1).join('.'))}`}); + api.applyMethod('addRenderFile', templatePath, entryPath, { + hydrate: webConfig.ssr || webConfig.snapshot, + resourcePath: `${formatPath(path.extname(pageEntry) ? pageEntry.split('.').slice(0, -1).join('.') : pageEntry)}` + }); return entryPath; } diff --git a/packages/build-mpa-config/src/template/rax.ts.ejs b/packages/build-mpa-config/src/template/rax.ts.ejs index 4a4bb053b7..f8c87ea063 100644 --- a/packages/build-mpa-config/src/template/rax.ts.ejs +++ b/packages/build-mpa-config/src/template/rax.ts.ejs @@ -1,7 +1,7 @@ import { render, createElement } from 'rax'; -import Component from '<%- resourcePath %>'; import DriverUniversal from 'driver-universal'; import { isWeex, isKraken } from 'universal-env'; +import Component from '<%- resourcePath %>'; const isSSR = window.__INITIAL_DATA__ && window.__INITIAL_DATA__.__SSR_ENABLED__; @@ -14,9 +14,9 @@ if (isWeex || isKraken) { if (isSSR && window.__INITIAL_DATA__.pageData !== null) { comProps = window.__INITIAL_DATA__.pageData; } else if (Component.getInitialProps) { - const comProps = await Component.getInitialProps(); + comProps = await Component.getInitialProps(); } - render(, document.getElementById("root"), { driver: DriverUniversal, hydrate: isSSR }); + render(, document.getElementById('root'), { driver: DriverUniversal, hydrate: <%- hydrate %> }); } renderApp(); -} \ No newline at end of file +} From 15d1cbba08245d790c7553961bd29f15ccee53da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8B=92=E7=8B=92=E7=A5=9E?= Date: Mon, 14 Dec 2020 14:53:32 +0800 Subject: [PATCH 14/21] chore: build config add web (#3919) --- packages/plugin-app-core/src/utils/getBuildConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-app-core/src/utils/getBuildConfig.ts b/packages/plugin-app-core/src/utils/getBuildConfig.ts index 6f685beae5..0bf2d4f489 100644 --- a/packages/plugin-app-core/src/utils/getBuildConfig.ts +++ b/packages/plugin-app-core/src/utils/getBuildConfig.ts @@ -8,7 +8,7 @@ function getBuildConfig(userConfig): IBuildConfig{ const { plugins } = userConfig; const buildConfig: IBuildConfig = {}; // filter userConfig - ['router', 'store'].forEach((configKey) => { + ['router', 'store', 'web'].forEach((configKey) => { if (Object.prototype.hasOwnProperty.call(userConfig, configKey)) { buildConfig[configKey] = userConfig[configKey]; } From a339b5ce9310f09d33dee8f103d89a38a7fa17be Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 15:22:20 +0800 Subject: [PATCH 15/21] chore: version --- packages/build-app-helpers/package.json | 2 +- packages/build-mpa-config/package.json | 2 +- packages/plugin-mpa/package.json | 2 +- packages/plugin-ssr/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/build-app-helpers/package.json b/packages/build-app-helpers/package.json index 520c97bbad..36d3ca8237 100644 --- a/packages/build-app-helpers/package.json +++ b/packages/build-app-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@builder/app-helpers", - "version": "1.0.3", + "version": "2.0.0", "description": "build helpers for app framework", "author": "ice-admin@alibaba-inc.com", "homepage": "", diff --git a/packages/build-mpa-config/package.json b/packages/build-mpa-config/package.json index 4a4e51edec..7dc9005b63 100644 --- a/packages/build-mpa-config/package.json +++ b/packages/build-mpa-config/package.json @@ -22,6 +22,6 @@ "dependencies": { "fs-extra": "^8.1.0", "loader-utils": "^2.0.0", - "@builder/app-helpers": "^1.0.3" + "@builder/app-helpers": "^2.0.0" } } \ No newline at end of file diff --git a/packages/plugin-mpa/package.json b/packages/plugin-mpa/package.json index b3b4bb28bd..456efd1f5f 100644 --- a/packages/plugin-mpa/package.json +++ b/packages/plugin-mpa/package.json @@ -23,7 +23,7 @@ "@alib/build-scripts": "^0.1.24" }, "dependencies": { - "@builder/app-helpers": "^1.0.3", + "@builder/app-helpers": "^2.0.0", "@builder/mpa-config": "^2.0.0", "fs-extra": "^8.1.0" } diff --git a/packages/plugin-ssr/package.json b/packages/plugin-ssr/package.json index 3b3aa270f3..ae3bc477f7 100644 --- a/packages/plugin-ssr/package.json +++ b/packages/plugin-ssr/package.json @@ -29,7 +29,7 @@ "fs-extra": "^9.0.1", "error-stack-tracey": "^0.1.3", "qs": "^6.9.4", - "@builder/app-helpers": "^1.0.3", + "@builder/app-helpers": "^2.0.0", "react-dev-utils": "^10.0.0" } } \ No newline at end of file From b3a5882401cec05f02184e94438bd37110d6a0b4 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 15:31:38 +0800 Subject: [PATCH 16/21] chore: version --- packages/icejs/package.json | 2 +- packages/plugin-app-core/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/icejs/package.json b/packages/icejs/package.json index 876201e8ff..95ad7339f1 100644 --- a/packages/icejs/package.json +++ b/packages/icejs/package.json @@ -22,7 +22,7 @@ }, "dependencies": { "@alib/build-scripts": "^0.1.13", - "build-plugin-app-core": "0.1.28", + "build-plugin-app-core": "1.0.0", "build-plugin-ice-auth": "1.7.2", "build-plugin-ice-config": "1.7.2", "build-plugin-ice-helpers": "1.7.1", diff --git a/packages/plugin-app-core/package.json b/packages/plugin-app-core/package.json index 7d7c491078..f4b26c137d 100644 --- a/packages/plugin-app-core/package.json +++ b/packages/plugin-app-core/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-app-core", - "version": "0.1.28", + "version": "1.0.0", "description": "the core plugin for icejs and raxjs.", "author": "ice-admin@alibaba-inc.com", "homepage": "", From 3ccd40a7b47ee6a84f336e2b1393131cc23c27fe Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 15:53:41 +0800 Subject: [PATCH 17/21] chore: version --- packages/plugin-app-core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-app-core/package.json b/packages/plugin-app-core/package.json index f4b26c137d..a8b9d1afb0 100644 --- a/packages/plugin-app-core/package.json +++ b/packages/plugin-app-core/package.json @@ -28,7 +28,7 @@ "miniapp-renderer": "^0.1.4", "prettier": "^2.0.2", "query-string": "^6.13.1", - "rax-app-renderer": "^0.1.4", + "rax-app-renderer": "^1.0.0", "rax-use-router": "^3.0.0", "react-app-renderer": "1.0.0", "universal-env": "^3.0.0", From a239124f925a7dc4af1f1cfa694af76ac843b59c Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 15:57:44 +0800 Subject: [PATCH 18/21] chore: version --- packages/plugin-app-core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-app-core/package.json b/packages/plugin-app-core/package.json index a8b9d1afb0..50c130cd19 100644 --- a/packages/plugin-app-core/package.json +++ b/packages/plugin-app-core/package.json @@ -30,7 +30,7 @@ "query-string": "^6.13.1", "rax-app-renderer": "^1.0.0", "rax-use-router": "^3.0.0", - "react-app-renderer": "1.0.0", + "react-app-renderer": "^1.0.0", "universal-env": "^3.0.0", "lodash.debounce": "^4.0.8" }, From 236b0346555babd27554c30f039b11fdcfe09d0b Mon Sep 17 00:00:00 2001 From: fushen Date: Mon, 14 Dec 2020 16:29:37 +0800 Subject: [PATCH 19/21] fix: babel-loader dep --- packages/build-mpa-config/src/generateEntry.ts | 2 +- packages/build-user-config/package.json | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/build-mpa-config/src/generateEntry.ts b/packages/build-mpa-config/src/generateEntry.ts index dc79efed69..25e52b52f0 100644 --- a/packages/build-mpa-config/src/generateEntry.ts +++ b/packages/build-mpa-config/src/generateEntry.ts @@ -7,7 +7,7 @@ function generateEntry(api, { framework, targetDir, pageEntry, entryName }) { const entryPath = path.join(entryFolder, `${entryName}.tsx`); const templatePath = path.join(__dirname, `./template/${framework}.ts.ejs`); api.applyMethod('addRenderFile', templatePath, entryPath, { - hydrate: webConfig.ssr || webConfig.snapshot, + hydrate: Boolean(webConfig.ssr || webConfig.snapshot), resourcePath: `${formatPath(path.extname(pageEntry) ? pageEntry.split('.').slice(0, -1).join('.') : pageEntry)}` }); return entryPath; diff --git a/packages/build-user-config/package.json b/packages/build-user-config/package.json index 4bd6e38832..898b719e24 100644 --- a/packages/build-user-config/package.json +++ b/packages/build-user-config/package.json @@ -1,6 +1,6 @@ { "name": "@builder/user-config", - "version": "0.1.3", + "version": "0.1.4", "description": "Includes methods which are releated to set base user config for framework", "homepage": "", "license": "MIT", @@ -28,7 +28,8 @@ "webpack-bundle-analyzer": "^3.6.0", "webpack-dev-mock": "^1.0.1", "webpack-plugin-import": "^0.2.6", - "@builder/app-helpers": "^1.0.2" + "@builder/app-helpers": "^1.0.2", + "babel-loader": "^8.0.6" }, "files": [ "lib" From 6f4ffcea870a15957e43d8ef736d933cad470c56 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 17:17:11 +0800 Subject: [PATCH 20/21] chore: version (#3925) * chore: version * chore: version --- packages/build-user-config/package.json | 4 ++-- packages/icejs/package.json | 2 +- packages/plugin-react-app/package.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/build-user-config/package.json b/packages/build-user-config/package.json index 898b719e24..10cbd1097b 100644 --- a/packages/build-user-config/package.json +++ b/packages/build-user-config/package.json @@ -28,7 +28,7 @@ "webpack-bundle-analyzer": "^3.6.0", "webpack-dev-mock": "^1.0.1", "webpack-plugin-import": "^0.2.6", - "@builder/app-helpers": "^1.0.2", + "@builder/app-helpers": "^2.0.0", "babel-loader": "^8.0.6" }, "files": [ @@ -44,4 +44,4 @@ "bugs": { "url": "https://github.com/alibaba/ice/issues" } -} +} \ No newline at end of file diff --git a/packages/icejs/package.json b/packages/icejs/package.json index 95ad7339f1..dbab90dd73 100644 --- a/packages/icejs/package.json +++ b/packages/icejs/package.json @@ -32,7 +32,7 @@ "build-plugin-ice-router": "1.7.6", "build-plugin-ice-ssr": "1.7.9", "build-plugin-ice-store": "1.7.11", - "build-plugin-react-app": "1.7.12", + "build-plugin-react-app": "1.7.13", "build-plugin-miniapp": "0.1.7", "chalk": "^4.1.0", "chokidar": "^3.3.1", diff --git a/packages/plugin-react-app/package.json b/packages/plugin-react-app/package.json index b4a88f1b90..80e292beec 100644 --- a/packages/plugin-react-app/package.json +++ b/packages/plugin-react-app/package.json @@ -1,6 +1,6 @@ { "name": "build-plugin-react-app", - "version": "1.7.12", + "version": "1.7.13", "description": "The basic webpack configuration for ice project", "author": "ice-admin@alibaba-inc.com", "main": "src/index.js", @@ -13,7 +13,7 @@ ], "license": "MIT", "dependencies": { - "@builder/app-helpers": "^1.0.2", + "@builder/app-helpers": "^2.0.0", "@builder/user-config": "^0.1.2", "build-scripts-config": "^0.1.0", "chalk": "^4.0.0", From ecc35619ecc801886058db59d1a01c8b874743dc Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Mon, 14 Dec 2020 17:22:53 +0800 Subject: [PATCH 21/21] feat: support colorNames (#3916) * feat: support colorNames * fix: rename config * chore: docs --- docs/guide/advance/fusion.md | 1 + packages/plugin-fusion/src/index.js | 16 ++++++++++++++-- packages/plugin-fusion/src/utils/getThemeVars.js | 10 +++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/guide/advance/fusion.md b/docs/guide/advance/fusion.md index 52e97cba21..c896154726 100644 --- a/docs/guide/advance/fusion.md +++ b/docs/guide/advance/fusion.md @@ -22,6 +22,7 @@ $ npm install build-plugin-fusion --save-dev * `usePx2Vw` 配合 postcss 插件,将 css 样式单位 px 转化为 vw ,默认为 false 不开启, true 为开启 * `px2vwOptions` 传递参数给postcss插件,默认为`{ viewportWidth: 750 }` 根据用户设置项将进行合并 * `componentOptions` 值为对象,修改业务组件的引入路径,推荐用在 PC 跨 H5 的项目中,给业务组件指定 H5 的渲染组件 +* `enableColorNames` 默认为 `false`,如果开启默认将提取 `transparent`、`red`、`blue` 等色值名称 ## 基础用法 diff --git a/packages/plugin-fusion/src/index.js b/packages/plugin-fusion/src/index.js index ccccb0c32d..9d5e97f17a 100644 --- a/packages/plugin-fusion/src/index.js +++ b/packages/plugin-fusion/src/index.js @@ -19,7 +19,19 @@ function normalizeEntry(entry, preparedChunks) { } module.exports = async ({ onGetWebpackConfig, log, context, getAllTask }, plugionOptions = {}) => { - const { themePackage, themeConfig, nextLibDir = 'es', usePx2Vw = false, px2vwOptions = {}, style = true, uniteNextLib, externalNext, importOptions = {}, componentOptions = {} } = plugionOptions; + const { + themePackage, + themeConfig, + nextLibDir = 'es', + usePx2Vw = false, + px2vwOptions = {}, + style = true, + uniteNextLib, + externalNext, + importOptions = {}, + componentOptions = {}, + enableColorNames, + } = plugionOptions; let { uniteBaseComponent } = plugionOptions; const { rootDir, pkg, userConfig, webpack } = context; @@ -62,7 +74,7 @@ module.exports = async ({ onGetWebpackConfig, log, context, getAllTask }, plugio calcVars = getCalcVars(varsPath, themePath, configData); } try { - themeVars = getThemeVars(themePath, Object.assign({}, calcVars, configData )); + themeVars = getThemeVars(themePath, Object.assign({}, calcVars, configData ), enableColorNames); } catch (err) { log.error('get theme variables err:', err); } diff --git a/packages/plugin-fusion/src/utils/getThemeVars.js b/packages/plugin-fusion/src/utils/getThemeVars.js index 52c816331d..3a907c67de 100644 --- a/packages/plugin-fusion/src/utils/getThemeVars.js +++ b/packages/plugin-fusion/src/utils/getThemeVars.js @@ -2,7 +2,7 @@ const fs = require('fs'); const colorNames = require('./colorNames'); -module.exports = (themeFile, themeConfig) => { +module.exports = (themeFile, themeConfig, enableColorNames) => { const themeVars = {}; try { const themeStr = fs.readFileSync(themeFile, 'utf8'); @@ -24,8 +24,12 @@ module.exports = (themeFile, themeConfig) => { originTheme[themeKey.slice(1)] = themeVars[themeKey]; const themeValue = themeVars[themeKey]; - if (themeValue && (themeValue.indexOf('#') !== 0 && !themeValue.match(/^(rgb|transparent)/) && !colorNames[themeValue] || ['$color-white', '$color-black'].indexOf(themeKey) > -1)) { - delete themeVars[themeKey]; + if (themeValue && themeValue.indexOf('#') !== 0 && themeValue.match(/^rgb/) || ['$color-white', '$color-black'].indexOf(themeKey) > -1) { + // delete theme key if it is not a color variable + const removeThemeVar = enableColorNames ? !themeValue.match(/^transparent/) && !colorNames[themeValue] : true; + if (removeThemeVar) { + delete themeVars[themeKey]; + } } });