From a4f03c76eb3df8da830839fd2a2064d6a658e993 Mon Sep 17 00:00:00 2001 From: xion Date: Sun, 1 Dec 2024 23:58:08 +0800 Subject: [PATCH] fix: update --- package.json | 5 +++++ rollup.config.js | 26 ++++++++++++++++++----- src/store.ts | 52 +++++++++++++++++++++++++++++++++++++++++----- src/web-config.ts | 4 ++-- src/web-context.ts | 4 ++-- src/web.ts | 8 +++++++ 6 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 src/web.ts diff --git a/package.json b/package.json index 3d818d7..5f43c3f 100644 --- a/package.json +++ b/package.json @@ -60,9 +60,14 @@ "./page": { "import": "./dist/web-page.js", "require": "./dist/web-page.js" + }, + "./web": { + "import": "./dist/web.js", + "require": "./dist/web.js" } }, "dependencies": { + "eventemitter3": "^5.0.1", "path-to-regexp": "^8.2.0" } } \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js index a324c73..02eb0c3 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -16,7 +16,7 @@ export default [ format: 'es', // 输出格式设置为 ES 模块 }, plugins: [ - resolve(), // 使用 @rollup/plugin-node-resolve 解析 node_modules 中的模块 + resolve({ browser: true }), // 使用 @rollup/plugin-node-resolve 解析 node_modules 中的模块 commonjs(), // 使用 @rollup/plugin-commonjs 解析 CommonJS 模块 typescript(), // 使用 @rollup/plugin-typescript 处理 TypeScript 文件 ], @@ -33,9 +33,9 @@ export default [ input: 'src/web-config.ts', output: { file: 'dist/web-config.js', - format: 'cjs', + format: 'es', }, - plugins: [resolve(), commonjs(), typescript()], + plugins: [resolve({ browser: true }), commonjs(), typescript()], }, { input: 'src/web-config.ts', @@ -51,7 +51,7 @@ export default [ file: 'dist/web-context.js', format: 'es', }, - plugins: [resolve(), commonjs(), typescript()], + plugins: [resolve({ browser: true }), commonjs(), typescript()], }, { input: 'src/web-context.ts', @@ -67,7 +67,7 @@ export default [ file: 'dist/web-page.js', format: 'es', }, - plugins: [resolve(), commonjs(), typescript()], + plugins: [resolve({ browser: true }), commonjs(), typescript()], }, { input: 'src/page.ts', @@ -77,4 +77,20 @@ export default [ }, plugins: [dts()], }, + { + input: 'src/web.ts', + output: { + file: 'dist/web.js', + format: 'es', + }, + plugins: [resolve({ browser: true }), commonjs(), typescript()], + }, + { + input: 'src/web.ts', + output: { + file: 'dist/web.d.ts', + format: 'es', + }, + plugins: [dts()], + }, ]; diff --git a/src/store.ts b/src/store.ts index 45261f8..8b02618 100644 --- a/src/store.ts +++ b/src/store.ts @@ -3,7 +3,11 @@ import { shallow } from 'zustand/shallow'; import { get } from 'lodash-es'; import deepEqual from 'fast-deep-equal'; +export const create = createZutandStore; +export type { StateCreator, StoreApi }; + type Listener = (state: any, prevState: any) => void; + export class StoreManager { stores: Record; constructor() { @@ -14,7 +18,7 @@ export class StoreManager { return this.stores[key]; } this.stores[key] = createZutandStore(initialStore); - return this.stores[key]; + return this.stores[key] as StoreApi; } create(initialStore: StateCreator, key: string) { return this.createStore(initialStore, key); @@ -31,8 +35,14 @@ export class StoreManager { shallow(objA: any, objB: any) { return shallow(objA, objB); } - subscribe(fn: Listener, { key, path, deep }: { key: string; path: string; deep?: boolean }) { - const _store = this.stores[key] as StoreApi; + /** + * path 为可以是 '.a.b.c'的形式 + * @param fn + * @param param1 + * @returns + */ + subscribe(fn: Listener, { key, path, deep, store }: { key: string; path: string; deep?: boolean; store?: StoreApi }) { + const _store = store || (this.stores[key] as StoreApi); if (!_store) { console.error('no store', key); return; @@ -59,8 +69,40 @@ export class StoreManager { }); } } +// export const store = new StoreManager(); -export const store = new StoreManager(); - +type FnListener = (state: T, prevState: T) => void; +type SubOptions = { + path?: string; + deep?: boolean; + store?: StoreApi; +}; +export const sub = (fn: FnListener, { path, deep, store }: SubOptions) => { + if (!store) { + console.error('no store'); + return; + } + return store.subscribe((newState: T, oldState: T) => { + try { + const newPath = get(newState, path); + const oldPath = get(oldState, path); + if (!newPath && !oldPath) { + // 都不存在 + return; + } + if (deep) { + if (!deepEqual(newPath, oldPath)) { + fn?.(newState, oldState); + } + return; + } + if (!shallow(newPath, oldPath)) { + fn?.(newState, oldState); + } + } catch (e) { + console.error('subscribe error', e); + } + }); +}; export { shallow, deepEqual }; diff --git a/src/web-config.ts b/src/web-config.ts index 0e41401..e8bd5d6 100644 --- a/src/web-config.ts +++ b/src/web-config.ts @@ -11,7 +11,7 @@ export const useConfig = (initConfig?: GlobalConfig) => { return _config; }; -export const useConfigKey = (key: string, init: () => T): T => { +export const useConfigKey = (key: string, init?: () => T): T => { const _config = useConfig({}); if (key && init) { _config[key] = init(); @@ -23,7 +23,7 @@ export const useConfigKey = (key: string, init: () => T): T => { return _config as any; }; -export const useConfigKeySync = async (key: string, init: () => Promise): Promise => { +export const useConfigKeySync = async (key: string, init?: () => Promise): Promise => { const _config = useConfig({}); if (key && init) { _config[key] = await init(); diff --git a/src/web-context.ts b/src/web-context.ts index 79005ad..5e30543 100644 --- a/src/web-context.ts +++ b/src/web-context.ts @@ -11,7 +11,7 @@ export const useContext = (initContext?: GlobalContext) => { return _context; }; -export const useContextKey = (key: string, init: () => T): T => { +export const useContextKey = (key: string, init?: () => T): T => { const _context = useContext({}); if (key && init) { _context[key] = init(); @@ -23,7 +23,7 @@ export const useContextKey = (key: string, init: () => T): T => { return _context as any; }; -export const useContextKeySync = async (key: string, init: () => Promise): Promise => { +export const useContextKeySync = async (key: string, init?: () => Promise): Promise => { const _context = useContext({}); if (key && init) { _context[key] = await init(); diff --git a/src/web.ts b/src/web.ts new file mode 100644 index 0000000..807e402 --- /dev/null +++ b/src/web.ts @@ -0,0 +1,8 @@ +export * from './page.ts'; +export * from './web-context.ts'; +export * from './web-config.ts'; + +export * from 'nanoid'; +export * from 'path-to-regexp'; + +export * from 'eventemitter3';