From 7aa80c753467b8a8976892076987a774f6e90bd1 Mon Sep 17 00:00:00 2001 From: Caihuanyu Date: Mon, 11 May 2020 23:34:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20watch=20=E5=A4=9A?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=B8=80=E6=AC=A1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remax-cli/src/build/babel/appEvent.ts | 22 +++++++++++++++++-- .../remax-cli/src/build/babel/pageEvent.ts | 20 ++++++++++++++++- packages/remax-cli/src/build/watch.ts | 11 ++++------ .../src/build/webpack/config.mini.ts | 2 +- .../src/build/webpack/plugins/Define.ts | 8 +++---- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/packages/remax-cli/src/build/babel/appEvent.ts b/packages/remax-cli/src/build/babel/appEvent.ts index d9a8ac0cf2..8ed401ba73 100644 --- a/packages/remax-cli/src/build/babel/appEvent.ts +++ b/packages/remax-cli/src/build/babel/appEvent.ts @@ -1,18 +1,32 @@ +import * as path from 'path'; import * as t from '@babel/types'; import { NodePath } from '@babel/traverse'; import { appEvents } from '@remax/macro'; import winPath from '../../winPath'; +import { Options } from '@remax/types'; const lifecycleEvents = ['onLaunch', 'onShow', 'onHide', 'onError', 'onShareAppMessage', 'onPageNotFound']; -export default () => { +export default (options: Options) => { + let skip = false; return { pre(state: any) { - appEvents.delete(winPath(state.opts.filename)); + const importer = winPath(state.opts.filename); + + if (importer.startsWith(winPath(path.join(options.cwd, options.rootDir)))) { + skip = true; + return; + } + + appEvents.delete(importer); }, visitor: { // 解析 class properties 编译后的代码 StringLiteral: (path: NodePath, state: any) => { + if (skip) { + return; + } + const importer = winPath(state.file.opts.filename); const { node } = path; @@ -24,6 +38,10 @@ export default () => { appEvents.set(importer, appEvents.get(importer)?.add(node.value) ?? new Set([node.value])); }, Identifier: (path: NodePath, state: any) => { + if (skip) { + return; + } + const importer = winPath(state.file.opts.filename); const { node } = path; diff --git a/packages/remax-cli/src/build/babel/pageEvent.ts b/packages/remax-cli/src/build/babel/pageEvent.ts index d2ccd3ee4d..dcdbfcfc1b 100644 --- a/packages/remax-cli/src/build/babel/pageEvent.ts +++ b/packages/remax-cli/src/build/babel/pageEvent.ts @@ -1,7 +1,9 @@ +import * as path from 'path'; import * as t from '@babel/types'; import { NodePath } from '@babel/traverse'; import { pageEvents } from '@remax/macro'; import winPath from '../../winPath'; +import { Options } from '@remax/types'; const lifecycleEvents = [ 'onLoad', @@ -24,14 +26,26 @@ const lifecycleEvents = [ 'onUnload', ]; -export default () => { +export default (options: Options) => { + let skip = false; return { pre(state: any) { + const importer = winPath(state.opts.filename); + + if (importer.startsWith(winPath(path.join(options.cwd, options.rootDir)))) { + skip = true; + return; + } + pageEvents.delete(winPath(state.opts.filename)); }, visitor: { // 解析 class properties 编译后的代码 StringLiteral: (path: NodePath, state: any) => { + if (skip) { + return; + } + const { node } = path; const importer = winPath(state.file.opts.filename); @@ -43,6 +57,10 @@ export default () => { pageEvents.set(importer, pageEvents.get(importer)?.add(node.value) ?? new Set([node.value])); }, Identifier: (path: NodePath, state: any) => { + if (skip) { + return; + } + const { node } = path; const importer = winPath(state.file.opts.filename); diff --git a/packages/remax-cli/src/build/watch.ts b/packages/remax-cli/src/build/watch.ts index b089b79824..396897cb5e 100644 --- a/packages/remax-cli/src/build/watch.ts +++ b/packages/remax-cli/src/build/watch.ts @@ -4,13 +4,14 @@ import { Compiler } from 'webpack'; import SingleEntryPlugin from 'webpack/lib/SingleEntryPlugin'; import { getPages } from '../getEntries'; -let isFirstRunWatcher = true; +let watchCounter = 0; export default function watch(options: Options, compiler: Compiler, watcher: any, addEntry = false) { + watchCounter += 1; // 监听额外的文件 const pages = getPages(options); chokidar.watch([`${options.rootDir}/app.config.{js,ts}`]).on('change', () => { - if (isFirstRunWatcher) return; + if (watchCounter <= 1) return; if (addEntry) { const nextPages = getPages(options); nextPages.forEach(np => { @@ -23,13 +24,9 @@ export default function watch(options: Options, compiler: Compiler, watcher: any }); chokidar.watch([`${options.rootDir}/**/*.config.{js,ts}`]).on('all', () => { - if (isFirstRunWatcher) return; + if (watchCounter <= 1) return; watcher.invalidate(); }); - if (isFirstRunWatcher) { - isFirstRunWatcher = false; - } - return watcher; } diff --git a/packages/remax-cli/src/build/webpack/config.mini.ts b/packages/remax-cli/src/build/webpack/config.mini.ts index 256cc2a611..739163b4b4 100644 --- a/packages/remax-cli/src/build/webpack/config.mini.ts +++ b/packages/remax-cli/src/build/webpack/config.mini.ts @@ -148,7 +148,7 @@ export default function webpackConfig(api: API, options: Options, target: Platfo .options({ babelrc: false, configFile: resolveBabelConfig(options), - usePlugins: [appEvent(), pageEvent(), componentManifest(api, config), fixRegeneratorRuntime()], + usePlugins: [appEvent(options), pageEvent(options), componentManifest(api, config), fixRegeneratorRuntime()], reactPreset: true, api, compact: process.env.NODE_ENV === 'production', diff --git a/packages/remax-cli/src/build/webpack/plugins/Define.ts b/packages/remax-cli/src/build/webpack/plugins/Define.ts index b06ab4ab6f..752845ddc3 100644 --- a/packages/remax-cli/src/build/webpack/plugins/Define.ts +++ b/packages/remax-cli/src/build/webpack/plugins/Define.ts @@ -1,9 +1,11 @@ +import * as path from 'path'; import { ReplaceSource } from 'webpack-sources'; import { Compiler, compilation } from 'webpack'; import { Options } from '@remax/types'; import { appEvents, pageEvents, hostComponents } from '@remax/macro'; import getModules from '../../utils/modules'; import { getPages } from '../../../getEntries'; +import winPath from '../../../winPath'; const PLUGIN_NAME = 'RemaxDefinePlugin'; @@ -61,7 +63,7 @@ export default class DefinePlugin { const modules = getModules(chunk); events[page.name] = modules.reduce((acc, cur) => { - return [...acc, ...(pageEvents.get(cur) || [])]; + return [...acc, ...(pageEvents.get(winPath(cur)) || [])]; }, []); }); @@ -75,10 +77,6 @@ export default class DefinePlugin { events = events.concat(Array.from(appEvents.get(key)!).sort()); } - if (process.env.NODE_ENV === 'test') { - events = []; - } - return JSON.stringify(events, null, 2); }