From 91593fc6d303ca914e9cf473821c8db03467b20e Mon Sep 17 00:00:00 2001 From: Meck Zhu Date: Sat, 9 May 2020 21:59:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20watch=20=E6=97=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #913 --- .../fixtures/define/expected/pages/index.js | 6 +- .../reactDomAlias/expected/pages/index.js | 51 ++--------- .../remax-cli/src/build/babel/pageEvent.ts | 11 +-- .../src/build/webpack/plugins/Define.ts | 85 ++++++++----------- .../remax-runtime/src/createPageConfig.ts | 4 +- .../remax-runtime/src/lifecycle/events.ts | 8 +- 6 files changed, 51 insertions(+), 114 deletions(-) diff --git a/packages/remax-cli/src/__tests__/fixtures/define/expected/pages/index.js b/packages/remax-cli/src/__tests__/fixtures/define/expected/pages/index.js index 094f8592f..cfa665222 100644 --- a/packages/remax-cli/src/__tests__/fixtures/define/expected/pages/index.js +++ b/packages/remax-cli/src/__tests__/fixtures/define/expected/pages/index.js @@ -598,9 +598,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "v3", function() { return v3; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "v5", function() { return v5; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "v6", function() { return v6; }); -var v3 = []; +var v3 = __REMAX_ENTRY_INFO__; var v5 = []; -var v6 = {}; +var v6 = { + "pages/index": [] +}; /***/ }), /* 9 */ diff --git a/packages/remax-cli/src/__tests__/fixtures/reactDomAlias/expected/pages/index.js b/packages/remax-cli/src/__tests__/fixtures/reactDomAlias/expected/pages/index.js index f7e51d5d1..1e78162de 100644 --- a/packages/remax-cli/src/__tests__/fixtures/reactDomAlias/expected/pages/index.js +++ b/packages/remax-cli/src/__tests__/fixtures/reactDomAlias/expected/pages/index.js @@ -2071,51 +2071,12 @@ function lowercase(str) { __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pageEvents", function() { return pageEvents; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "appEvents", function() { return appEvents; }); -var __read = undefined && undefined.__read || function (o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) { - ar.push(r.value); - } - } catch (error) { - e = { - error: error - }; - } finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } finally { - if (e) throw e.error; - } - } - - return ar; +var PAGE_EVENTS = { + "pages/index": [] }; - -var __spread = undefined && undefined.__spread || function () { - for (var ar = [], i = 0; i < arguments.length; i++) { - ar = ar.concat(__read(arguments[i])); - } - - return ar; -}; - -var ENTRY_INFO = []; -var PAGE_EVENTS = {}; var APP_EVENTS = []; -function pageEvents(entry) { - var entryInfo = ENTRY_INFO.find(function (e) { - return e.name === entry; - }); - return ((entryInfo === null || entryInfo === void 0 ? void 0 : entryInfo.modules) || []).reduce(function (acc, cur) { - return __spread(acc, PAGE_EVENTS[cur] || []); - }, []); +function pageEvents(name) { + return PAGE_EVENTS[name]; } function appEvents() { return APP_EVENTS; @@ -2441,7 +2402,7 @@ function generatePageId() { function resetPageId() { idCounter = 0; } -function createPageConfig(Page, entry) { +function createPageConfig(Page, name) { var app = getApp(); var config = { data: { @@ -2578,7 +2539,7 @@ function createPageConfig(Page, entry) { return this.callLifecycle(_lifecycle__WEBPACK_IMPORTED_MODULE_2__["Lifecycle"].pullIntercept); } }; - Object(_lifecycle__WEBPACK_IMPORTED_MODULE_2__["pageEvents"])(entry).forEach(function (eventName) { + Object(_lifecycle__WEBPACK_IMPORTED_MODULE_2__["pageEvents"])(name).forEach(function (eventName) { if (lifecycleEvents[eventName]) { config[eventName] = lifecycleEvents[eventName]; } diff --git a/packages/remax-cli/src/build/babel/pageEvent.ts b/packages/remax-cli/src/build/babel/pageEvent.ts index ca29f9ab5..1c2c3aaab 100644 --- a/packages/remax-cli/src/build/babel/pageEvent.ts +++ b/packages/remax-cli/src/build/babel/pageEvent.ts @@ -48,11 +48,7 @@ export default (options: Options) => { return; } - const parentNode = path.parentPath.node; - - if (t.isCallExpression(parentNode) && (parentNode.callee as any)?.name === '_defineProperty') { - pageEvents.set(entry, pageEvents.get(entry)?.add(node.value) ?? new Set([node.value])); - } + pageEvents.set(entry, pageEvents.get(entry)?.add(node.value) ?? new Set([node.value])); }, Identifier: (path: NodePath) => { if (skip) { @@ -66,11 +62,6 @@ export default (options: Options) => { return; } - // 非函数定义不处理 - if (!t.isFunctionExpression(path.parentPath.node)) { - return; - } - pageEvents.set(entry, pageEvents.get(entry)?.add(node.name) ?? new Set([node.name])); }, }, diff --git a/packages/remax-cli/src/build/webpack/plugins/Define.ts b/packages/remax-cli/src/build/webpack/plugins/Define.ts index 2beb77ed1..4304ae5ea 100644 --- a/packages/remax-cli/src/build/webpack/plugins/Define.ts +++ b/packages/remax-cli/src/build/webpack/plugins/Define.ts @@ -15,30 +15,35 @@ export default class DefinePlugin { } apply(compiler: Compiler) { - compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => { - compilation.moduleTemplates.javascript.hooks.render.tap(PLUGIN_NAME, moduleSource => { - const source = new ReplaceSource(moduleSource); - - const startA = this.getReplaceStartIndex(source, /__REMAX_ENTRY_INFO__/); - const startB = this.getReplaceStartIndex(source, /__REMAX_APP_EVENTS__/); - const startC = this.getReplaceStartIndex(source, /__REMAX_PAGE_EVENTS__/); - const startD = this.getReplaceStartIndex(source, /__REMAX_HOST_COMPONENTS__/); - - if (startA) { - source.replace(startA, startA + 19, this.stringifyEntryInfo(compilation)); - } - if (startB) { - source.replace(startB, startB + 19, this.stringifyAppEvents()); - } - if (startC) { - source.replace(startC, startC + 20, this.stringifyPageEvents()); - } - - if (startD) { - source.replace(startD, startD + 24, this.stringifyHostComponents()); - } - - return source; + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation: compilation.Compilation) => { + compilation.hooks.optimizeChunkAssets.tapAsync(PLUGIN_NAME, (chunks, callback) => { + compilation.chunkGroups.forEach(group => { + group.chunks.forEach((chunk: any) => { + const chunkPath = chunk.name + '.js'; + const source = new ReplaceSource(compilation.assets[chunkPath]); + + const startB = this.getReplaceStartIndex(source, /__REMAX_APP_EVENTS__/); + const startC = this.getReplaceStartIndex(source, /__REMAX_PAGE_EVENTS__/); + const startD = this.getReplaceStartIndex(source, /__REMAX_HOST_COMPONENTS__/); + + if (startB) { + source.replace(startB, startB + 19, this.stringifyAppEvents()); + } + if (startC) { + source.replace(startC, startC + 20, this.stringifyPageEvents(compilation)); + } + + if (startD) { + source.replace(startD, startD + 24, this.stringifyHostComponents()); + } + compilation.assets[chunkPath] = source; + }); + }); + + appEvents.clear(); + pageEvents.clear(); + + callback(); }); }); } @@ -47,8 +52,10 @@ export default class DefinePlugin { return regExp.exec(source.source())?.index; } - stringifyEntryInfo(compilation: compilation.Compilation) { - let entryWithModules = getPages(this.remaxOptions).map(page => { + stringifyPageEvents(compilation: compilation.Compilation) { + const events: any = {}; + + getPages(this.remaxOptions).map(page => { const chunk = compilation.chunks.find(c => { return c.name === page.name; }); @@ -56,31 +63,11 @@ export default class DefinePlugin { // TODO: 应该有更好的获取 modules 的方式? const modules = getModules(chunk); - return { - name: chunk.name, - modules, - }; + events[page.name] = modules.reduce((acc, cur) => { + return [...acc, ...(pageEvents.get(cur) || [])]; + }, []); }); - if (process.env.NODE_ENV === 'test') { - entryWithModules = []; - } - - return JSON.stringify(entryWithModules, null, 2); - } - - stringifyPageEvents() { - let events: any = {}; - - for (const key of pageEvents.keys()) { - // 这里 get 不可能为空 - events[key] = Array.from(pageEvents.get(key)!).sort(); - } - - if (process.env.NODE_ENV === 'test') { - events = {}; - } - return JSON.stringify(events, null, 2); } diff --git a/packages/remax-runtime/src/createPageConfig.ts b/packages/remax-runtime/src/createPageConfig.ts index 2885c2787..229d087a2 100644 --- a/packages/remax-runtime/src/createPageConfig.ts +++ b/packages/remax-runtime/src/createPageConfig.ts @@ -19,7 +19,7 @@ export function resetPageId() { idCounter = 0; } -export default function createPageConfig(Page: React.ComponentType, entry: string) { +export default function createPageConfig(Page: React.ComponentType, name: string) { const app = getApp() as any; const config: any = { @@ -178,7 +178,7 @@ export default function createPageConfig(Page: React.ComponentType, entry: }, }; - pageEvents(entry).forEach(eventName => { + pageEvents(name).forEach(eventName => { if (lifecycleEvents[eventName]) { config[eventName] = lifecycleEvents[eventName]; } diff --git a/packages/remax-runtime/src/lifecycle/events.ts b/packages/remax-runtime/src/lifecycle/events.ts index e903c9641..bb3893b20 100644 --- a/packages/remax-runtime/src/lifecycle/events.ts +++ b/packages/remax-runtime/src/lifecycle/events.ts @@ -1,12 +1,8 @@ -const ENTRY_INFO = __REMAX_ENTRY_INFO__; const PAGE_EVENTS = __REMAX_PAGE_EVENTS__; const APP_EVENTS = __REMAX_APP_EVENTS__; -export function pageEvents(entry: string) { - const entryInfo = ENTRY_INFO.find((e: any) => e.name === entry); - return ((entryInfo?.modules || []) as string[]).reduce((acc, cur) => { - return [...acc, ...(PAGE_EVENTS[cur] || [])]; - }, []); +export function pageEvents(name: string): string[] { + return PAGE_EVENTS[name]; } export function appEvents(): string[] {