ez-saga 18.0.7 → 18.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/lib/webpack/loader.d.ts +1 -1
- package/lib/webpack/loader.js +28 -5
- package/lib/webpack/loader.js.map +1 -1
- package/package.json +2 -1
- package/src/webpack/loader.ts +28 -5
package/README.md
CHANGED
|
@@ -1,4 +1,24 @@
|
|
|
1
|
-
The
|
|
1
|
+
The ez-saga project is a project that imitates dva-js
|
|
2
|
+
|
|
3
|
+
# Why ez-saga?
|
|
4
|
+
|
|
5
|
+
`ez-saga` is designed to simplify Redux + Saga development, offering a modern, developer-friendly experience similar to `dva` but with significant improvements:
|
|
6
|
+
|
|
7
|
+
| Feature | ez-saga | dva | Raw Redux-Saga |
|
|
8
|
+
| :--- | :--- | :--- | :--- |
|
|
9
|
+
| **Model Architecture** | Centralized (State + Reducers + Effects) | Centralized | Scattered (Actions, Switch, Watchers separated) |
|
|
10
|
+
| **TypeScript Support** | **First-class**, with automatic type inference helper | Poor / Manual | Good but verbose |
|
|
11
|
+
| **Hot Module Replacement** | **Zero-config** (Vite & Webpack 5), supports hot-swapping reducers & effects | Broken / Unmaintained | Manual / Complex setup |
|
|
12
|
+
| **API Simplicity** | **High** (`createApp`, `regist`) | High | Low (High boilerplate) |
|
|
13
|
+
| **Build Tooling** | **Vite & Webpack 5** Support | Webpack 3/4 (Roadhog/Umi dependency) | Agnostic |
|
|
14
|
+
| **Maintenance** | Active | Inactive / Legacy | Active |
|
|
15
|
+
|
|
16
|
+
**Key Advantages:**
|
|
17
|
+
- **Zero Boilerplate**: No more action types, switch statements, or `yield take` watchers. Just write functions.
|
|
18
|
+
- **Modern HMR**: Built-in plugins for Vite and Webpack to keep your state and logic hot-updatable without page reloads.
|
|
19
|
+
- **Decoupled**: Works with any React setup, not tied to a specific framework like Umi.
|
|
20
|
+
|
|
21
|
+
|
|
2
22
|
|
|
3
23
|
# how to use?
|
|
4
24
|
install
|
package/lib/webpack/loader.d.ts
CHANGED
package/lib/webpack/loader.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import MagicString from 'magic-string';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import merge from 'merge-source-map';
|
|
2
4
|
/**
|
|
3
5
|
* ez-saga Webpack Loader
|
|
4
6
|
* 对应 src/vite/index.ts 的逻辑,用于 Webpack 场景
|
|
5
7
|
*/
|
|
6
|
-
export default function (source) {
|
|
8
|
+
export default function (source, inputSourceMap) {
|
|
7
9
|
// 简单的特征检测
|
|
8
10
|
const hasDefaultExport = /export\s+default/.test(source) || /exports\.default\s*=/.test(source) || /module\.exports\s*=/.test(source);
|
|
9
11
|
// name属性检查 (宽松匹配: name: "foo" 或 name = "foo")
|
|
@@ -42,7 +44,7 @@ export default function (source) {
|
|
|
42
44
|
}
|
|
43
45
|
else {
|
|
44
46
|
// 匹配失败
|
|
45
|
-
this.callback(null, source);
|
|
47
|
+
this.callback(null, source, inputSourceMap);
|
|
46
48
|
return;
|
|
47
49
|
}
|
|
48
50
|
// 注入 HMR 逻辑
|
|
@@ -59,10 +61,31 @@ if (module.hot) {
|
|
|
59
61
|
}
|
|
60
62
|
`;
|
|
61
63
|
s.append(hmrCode);
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
+
// 生成当前的 map
|
|
65
|
+
const intermediateFileName = path.basename(this.resourcePath) + ".intermediate.js";
|
|
66
|
+
const currentMap = s.generateMap({
|
|
67
|
+
source: intermediateFileName,
|
|
68
|
+
hires: true,
|
|
69
|
+
includeContent: true
|
|
70
|
+
});
|
|
71
|
+
// 如果有输入的 map (来自 ts-loader),则合并
|
|
72
|
+
let outputMap = currentMap;
|
|
73
|
+
if (inputSourceMap) {
|
|
74
|
+
try {
|
|
75
|
+
// merge-source-map(oldMap, newMap)
|
|
76
|
+
outputMap = merge(inputSourceMap, JSON.parse(currentMap.toString()));
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
console.warn('[ez-saga-loader] SourceMap merge failed:', e);
|
|
80
|
+
outputMap = JSON.parse(currentMap.toString());
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
outputMap = JSON.parse(currentMap.toString());
|
|
85
|
+
}
|
|
86
|
+
callback(null, s.toString(), outputMap);
|
|
64
87
|
return;
|
|
65
88
|
}
|
|
66
|
-
this.callback(null, source);
|
|
89
|
+
this.callback(null, source, inputSourceMap);
|
|
67
90
|
}
|
|
68
91
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/webpack/loader.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/webpack/loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ez-saga",
|
|
3
|
-
"version": "18.0.
|
|
3
|
+
"version": "18.0.8",
|
|
4
4
|
"description": "The ez-saga project is a project that imitates dva-js",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@reduxjs/toolkit": "^2.11.2",
|
|
48
48
|
"magic-string": "^0.30.21",
|
|
49
|
+
"merge-source-map": "^1.1.0",
|
|
49
50
|
"redux": "^5.0.1",
|
|
50
51
|
"redux-saga": "^1.4.2",
|
|
51
52
|
"tslib": "^2.8.1"
|
package/src/webpack/loader.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import MagicString from 'magic-string';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import merge from 'merge-source-map';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* ez-saga Webpack Loader
|
|
5
7
|
* 对应 src/vite/index.ts 的逻辑,用于 Webpack 场景
|
|
6
8
|
*/
|
|
7
|
-
export default function (this: any, source: string) {
|
|
9
|
+
export default function (this: any, source: string, inputSourceMap?: any) {
|
|
8
10
|
// 简单的特征检测
|
|
9
11
|
const hasDefaultExport = /export\s+default/.test(source) || /exports\.default\s*=/.test(source) || /module\.exports\s*=/.test(source);
|
|
10
12
|
// name属性检查 (宽松匹配: name: "foo" 或 name = "foo")
|
|
@@ -44,7 +46,7 @@ export default function (this: any, source: string) {
|
|
|
44
46
|
s.append(`\nmodule.exports = ${modelVarName};\n`);
|
|
45
47
|
} else {
|
|
46
48
|
// 匹配失败
|
|
47
|
-
this.callback(null, source);
|
|
49
|
+
this.callback(null, source, inputSourceMap);
|
|
48
50
|
return;
|
|
49
51
|
}
|
|
50
52
|
|
|
@@ -63,10 +65,31 @@ if (module.hot) {
|
|
|
63
65
|
`;
|
|
64
66
|
s.append(hmrCode);
|
|
65
67
|
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
+
// 生成当前的 map
|
|
69
|
+
const intermediateFileName = path.basename(this.resourcePath) + ".intermediate.js";
|
|
70
|
+
const currentMap = s.generateMap({
|
|
71
|
+
source: intermediateFileName,
|
|
72
|
+
hires: true,
|
|
73
|
+
includeContent: true
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// 如果有输入的 map (来自 ts-loader),则合并
|
|
77
|
+
let outputMap = currentMap;
|
|
78
|
+
if (inputSourceMap) {
|
|
79
|
+
try {
|
|
80
|
+
// merge-source-map(oldMap, newMap)
|
|
81
|
+
outputMap = merge(inputSourceMap, JSON.parse(currentMap.toString()));
|
|
82
|
+
} catch (e) {
|
|
83
|
+
console.warn('[ez-saga-loader] SourceMap merge failed:', e);
|
|
84
|
+
outputMap = JSON.parse(currentMap.toString());
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
outputMap = JSON.parse(currentMap.toString());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
callback(null, s.toString(), outputMap);
|
|
68
91
|
return;
|
|
69
92
|
}
|
|
70
93
|
|
|
71
|
-
this.callback(null, source);
|
|
94
|
+
this.callback(null, source, inputSourceMap);
|
|
72
95
|
}
|