diff --git a/.eslintrc.js b/.eslintrc.js index 03cb6bf..686d228 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -32,5 +32,6 @@ module.exports = { 'operator-linebreak': 0, 'no-unused-vars': 1, 'space-before-function-paren': 0, // 交由 prettier 管理 + 'valid-jsdoc': 0, }, }; diff --git a/README.md b/README.md index 82a1cfe..e34b4ba 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,8 @@ const spider = new JSpider( }), Download() ); -spider.apply(urls); +spider.crawl(urls); +spider.start(); // 等待下载完成! ``` @@ -58,52 +59,6 @@ spider.apply(urls); **CORS 和 CSP 是浏览器的安全策略**,与 JSpider 无关,我推荐您遵守。很多网站使用了这两种协议来防止 Javascript 语言在浏览器中为所欲为,所以如果您使用的是 Chrome,可以在 [Chrome 插件商店](https://chrome.google.com/webstore/category/extensions?hl=zh-CN) 中搜索 CORS 和 CSP,安装相应的插件即可解除这两个协议的报错。我无法保证这些插件的安全性,所以在此不推荐。 -## JSpider 3 更新内容 - -JSpider 相较于 2.0+ 版本: - -1. 开箱即用,不用任何配置,您只需要 **填入 url 数组** ! - -2. 优化了 JSpider 内部的结构,使得 JSpider 在开箱即用的情况下可以拥有 **极大的自定义空间**。 - -3. **拥抱 rxjs**。我非常喜欢 rxjs 的编程方式,所以 JSpider 的底层都是使用 rxjs 构建的,在创建 plugins 的时候也是采用 rxjs。 - -4. **全面插件化**。JSpider 除了核心功能外,全部都是由 Plugins 组成,这样只需要制作插件就可以了! - -### 关于 JSpider 的未来 - -JSpider 未来的目标是兼容 NodeJS 平台和浏览器,让一套代码运行在两个平台,加速爬虫极客的开发速率! - -关于编程上的具体路径是实现 Typescript 化,但是限于编程能力,没有办法实现完整的 Typescript 化,所以未来的版本都会以 ECMA 标准来编写。 - -## **对于 JSpider 使用的库的感谢声明** - -JSpider 项目研究过程中使用到了这些库。源代码文件通过 npm 和 jsDelivr 网站两个来源载入。排名不分先后,只是记录个人对于这些库的使用体验。 - -1. [Rxjs]() 十分好用的响应式编程库,以至于 JSpider 的主要构架就是使用它写出来的。 - -2. [Rollup]() 代码打包库,使用 Rollup 打包的库为我的项目节省了很多时间。 - -3. [Mockjs]() 很有想法的一个前端数据代理库,很可惜的是没有提供 fetch 的代理,所以我自己重做了这个库。 - -4. [lodash-es]() 无敌的工具库,在一些比较常用的底层代码中有使用。 - -5. [xlsx]() ExcelHelper 的核心插件,用于从对象数据直接构建 Excel 常用文件的操作,十分好用的一个插件。 - -6. [jszip]() 用于制作压缩文件的插件,十分好用 - -7. [dexie.js]() JSpider 得以链接 indexDB 进行储存操作的救星,说实话 indexDB 的 API 太乱了。 - -8. [zangodb.js]() 这个也是对 indexDB 的数据操作的一个库,API 简单易用,但是在项目中选择了更为活跃的 dexie.js 进行了 indexDB 的链接。 - -9. [uuid]() 用于创建 UUID 的项目,可以生成唯一的标识,用于 JSpider 的底层逻辑中。 - -10. [consola]() 用于控制台的输出美化 - -11. [docsify]() 基于 Vue 的很好用的前端文档网页生成工具,由于本身的扩展性较好,所以添加了一些功能。 - -**感谢上面的项目为 JSpider 提供了众多的帮助!** - ## License 自 3.2 版本之后的版本都设置为 Apache-2.0, 3.2 之前版本均为 MIT License diff --git a/docs/assets/dependencies.svg b/docs/assets/dependencies.svg index f1b413f..e046ba2 100644 --- a/docs/assets/dependencies.svg +++ b/docs/assets/dependencies.svg @@ -4,658 +4,688 @@ - - + + G - + ControlPanel/ControlPanel.js - -ControlPanel/ControlPanel.js + +ControlPanel/ControlPanel.js - + -ControlPanel/EventHub.js - -ControlPanel/EventHub.js +ControlPanel/StaticEvent.js + +ControlPanel/StaticEvent.js - + -ControlPanel/ControlPanel.js->ControlPanel/EventHub.js - - +ControlPanel/ControlPanel.js->ControlPanel/StaticEvent.js + + - + -ControlPanel/StaticEvent.js - -ControlPanel/StaticEvent.js +ControlPanel/TaskManager.js + +ControlPanel/TaskManager.js - + -ControlPanel/ControlPanel.js->ControlPanel/StaticEvent.js - - +ControlPanel/ControlPanel.js->ControlPanel/TaskManager.js + + - + -TaskSystem/Task.js - -TaskSystem/Task.js +utils/EventHub.js + +utils/EventHub.js - + -ControlPanel/ControlPanel.js->TaskSystem/Task.js - - +ControlPanel/ControlPanel.js->utils/EventHub.js + + utils/functionQueue.js - -utils/functionQueue.js + +utils/functionQueue.js ControlPanel/ControlPanel.js->utils/functionQueue.js - - + + - - -TaskSystem/Task.js->ControlPanel/EventHub.js - - + + +utils/pauseToggle.js + +utils/pauseToggle.js + + + +ControlPanel/ControlPanel.js->utils/pauseToggle.js + + + + + +TaskSystem/TaskGroup.js + +TaskSystem/TaskGroup.js + + + +ControlPanel/StaticEvent.js->TaskSystem/TaskGroup.js + + + + + +TaskSystem/Task.js + +TaskSystem/Task.js + + + +ControlPanel/TaskManager.js->TaskSystem/Task.js + + + + + +TaskSystem/TaskGroup.js->TaskSystem/Task.js + + + + + +TaskSystem/Task.js->utils/EventHub.js + + - + TaskSystem/Data.js - -TaskSystem/Data.js + +TaskSystem/Data.js - + TaskSystem/Task.js->TaskSystem/Data.js - - + + - + TaskSystem/StaticEvent.js - -TaskSystem/StaticEvent.js + +TaskSystem/StaticEvent.js - + TaskSystem/Task.js->TaskSystem/StaticEvent.js - - + + - + ControlPanel/index.js - -ControlPanel/index.js + +ControlPanel/index.js - + ControlPanel/index.js->ControlPanel/ControlPanel.js - - + + - + Errors/errors.js - -Errors/errors.js + +Errors/errors.js - + Pipeline/PluginSystem.js - -Pipeline/PluginSystem.js + +Pipeline/PluginSystem.js - + Pipeline/PluginSystem.js->Errors/errors.js - - + + - + utils/createUUID.js - -utils/createUUID.js + +utils/createUUID.js - + Pipeline/PluginSystem.js->utils/createUUID.js - - + + - + Pipeline/index.js - -Pipeline/index.js + +Pipeline/index.js - + Pipeline/index.js->utils/functionQueue.js - - + + - + Pipeline/index.js->utils/createUUID.js - - + + - + Spider/index.js - -Spider/index.js + +Spider/index.js - - -Spider/index.js->ControlPanel/EventHub.js - - + + +Spider/index.js->utils/EventHub.js + + - + Spider/index.js->ControlPanel/index.js - - + + - + Spider/index.js->Pipeline/index.js - - + + - + Spider/staticEvent.js - -Spider/staticEvent.js + +Spider/staticEvent.js - + Spider/index.js->Spider/staticEvent.js - - - - - -TaskSystem/TaskGroup.js - -TaskSystem/TaskGroup.js - - - -TaskSystem/TaskGroup.js->TaskSystem/Task.js - - + + - + TaskSystem/index.js - -TaskSystem/index.js - - - -TaskSystem/index.js->TaskSystem/Task.js - - + +TaskSystem/index.js - + TaskSystem/index.js->TaskSystem/TaskGroup.js - - + + + + + +TaskSystem/index.js->TaskSystem/Task.js + + - + index.js - -index.js + +index.js - + index.js->Pipeline/PluginSystem.js - - + + - + index.js->Spider/index.js - - + + - + index.js->TaskSystem/index.js - - + + - + plugins/index.js - -plugins/index.js + +plugins/index.js - + index.js->plugins/index.js - - + + - + tools/index.js tools/index.js - + index.js->tools/index.js - - + + - + plugins/Download.js - -plugins/Download.js + +plugins/Download.js - + plugins/index.js->plugins/Download.js - - + + - + plugins/ExcelHelper.js - -plugins/ExcelHelper.js + +plugins/ExcelHelper.js - + plugins/index.js->plugins/ExcelHelper.js - - + + - + plugins/Request.js - -plugins/Request.js + +plugins/Request.js - + plugins/index.js->plugins/Request.js - - + + - + plugins/zipFile.js - -plugins/zipFile.js + +plugins/zipFile.js - + plugins/index.js->plugins/zipFile.js - - + + - + tools/loader/loader.js tools/loader/loader.js - + tools/index.js->tools/loader/loader.js - + tools/Mock/Mock.js tools/Mock/Mock.js - + tools/index.js->tools/Mock/Mock.js - + tools/analysis/index.js tools/analysis/index.js - + tools/index.js->tools/analysis/index.js - + plugins/Download.js->Pipeline/PluginSystem.js - - + + - + plugins/utils/toFile.js - -plugins/utils/toFile.js + +plugins/utils/toFile.js - + plugins/Download.js->plugins/utils/toFile.js - - + + - + plugins/ExcelHelper.js->Pipeline/PluginSystem.js - - + + - + plugins/ExcelHelper/createExcelFile.js - -plugins/ExcelHelper/createExcelFile.js + +plugins/ExcelHelper/createExcelFile.js - + plugins/ExcelHelper.js->plugins/ExcelHelper/createExcelFile.js - - + + - + plugins/ExcelHelper/xlsx.js - -plugins/ExcelHelper/xlsx.js + +plugins/ExcelHelper/xlsx.js - + plugins/ExcelHelper.js->plugins/ExcelHelper/xlsx.js - - + + - + plugins/ExcelHelper/createExcelFile.js->plugins/ExcelHelper/xlsx.js - - + + - + plugins/ExcelHelper/xlsx.js->tools/loader/loader.js - - + + - + utils/type.js utils/type.js - + tools/loader/loader.js->utils/type.js - + tools/loader/jsDelivr.js - -tools/loader/jsDelivr.js + +tools/loader/jsDelivr.js - + tools/loader/loader.js->tools/loader/jsDelivr.js - - + + - + tools/loader/loaderFunction.js - -tools/loader/loaderFunction.js + +tools/loader/loaderFunction.js - + tools/loader/loader.js->tools/loader/loaderFunction.js - - + + - + tools/loader/scriptStore.js - -tools/loader/scriptStore.js + +tools/loader/scriptStore.js - + tools/loader/loader.js->tools/loader/scriptStore.js - - + + - + plugins/JSzip/JSzip.js - -plugins/JSzip/JSzip.js + +plugins/JSzip/JSzip.js - + plugins/JSzip/JSzip.js->tools/loader/loader.js - - + + - + plugins/JSzip/zipper.js - -plugins/JSzip/zipper.js + +plugins/JSzip/zipper.js - + plugins/JSzip/zipper.js->plugins/JSzip/JSzip.js - - + + - + plugins/Request.js->Pipeline/PluginSystem.js - - + + - + utils/concurrent.js - -utils/concurrent.js + +utils/concurrent.js - + plugins/Request.js->utils/concurrent.js - - + + - + utils/retryAndDelay.js - -utils/retryAndDelay.js + +utils/retryAndDelay.js - + utils/concurrent.js->utils/retryAndDelay.js - - - - - -plugins/zipFile.js->Pipeline/PluginSystem.js - - + + - + plugins/zipFile.js->TaskSystem/TaskGroup.js - - + + + + + +plugins/zipFile.js->Pipeline/PluginSystem.js + + - + plugins/zipFile.js->plugins/utils/toFile.js - - + + - + plugins/zipFile.js->plugins/JSzip/JSzip.js - - + + - + plugins/zipFile.js->plugins/JSzip/zipper.js - - + + - + tools/Mock/Mock.js->tools/loader/loader.js - + tools/Mock/Server/index.js tools/Mock/Server/index.js - + tools/Mock/Mock.js->tools/Mock/Server/index.js - + tools/Mock/Server/excel.js tools/Mock/Server/excel.js - + tools/Mock/Server/index.js->tools/Mock/Server/excel.js - + tools/analysis/Search/GlobalVars.js tools/analysis/Search/GlobalVars.js - + tools/analysis/Search/window-default.json tools/analysis/Search/window-default.json - + tools/analysis/Search/GlobalVars.js->tools/analysis/Search/window-default.json - + tools/analysis/Search/Search.js tools/analysis/Search/Search.js - + tools/analysis/Search/searchObj.js tools/analysis/Search/searchObj.js - + tools/analysis/Search/Search.js->tools/analysis/Search/searchObj.js - + tools/analysis/Search/searchObj.js->utils/type.js - + tools/analysis/antiDebugger.js - -tools/analysis/antiDebugger.js + +tools/analysis/antiDebugger.js - + tools/analysis/copy.js - -tools/analysis/copy.js + +tools/analysis/copy.js - + tools/analysis/index.js->tools/analysis/Search/GlobalVars.js - + tools/analysis/index.js->tools/analysis/Search/Search.js - + tools/analysis/index.js->tools/analysis/antiDebugger.js - - + + - + tools/analysis/index.js->tools/analysis/copy.js - - + + - + utils/retryAndDelay.js->Errors/errors.js - - + + diff --git a/package.json b/package.json index 26d3c69..fddc106 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,9 @@ "scripts": { "dev": "rollup --config rollup.config.dev.js -w", "build": "rollup --config rollup.config.build.js", - "lint": "eslint src", - "Lint": "prettier --write src/**/*.{ts,json,md,yml,js} & eslint src", - "prettier": "prettier --write src/**/*.{ts,json,md,yml,js}", - "docs": "docsify serve docs", + "lint": "eslint src plugins", + "Lint": "prettier --write src/**/*.{ts,json,md,yml,js} plugins/**/*.{ts,json,md,yml,js} && eslint src plugins", + "prettier": "prettier --write src/**/*.{ts,json,md,yml,js} plugins/**/*.{ts,json,md,yml,js}", "graph": "madge --image docs/assets/dependencies.svg src/index.js", "release": "standard-version", "lint-staged": "lint-staged", diff --git a/src/plugins/Dexie.js b/plugins/Dexie.js similarity index 100% rename from src/plugins/Dexie.js rename to plugins/Dexie.js diff --git a/src/plugins/Dexie/Dexie.js b/plugins/Dexie/Dexie.js similarity index 100% rename from src/plugins/Dexie/Dexie.js rename to plugins/Dexie/Dexie.js diff --git a/src/plugins/Dexie/data.js b/plugins/Dexie/data.js similarity index 100% rename from src/plugins/Dexie/data.js rename to plugins/Dexie/data.js diff --git a/src/plugins/Download.js b/plugins/Download.js similarity index 100% rename from src/plugins/Download.js rename to plugins/Download.js diff --git a/src/plugins/ExcelHelper.js b/plugins/ExcelHelper.js similarity index 100% rename from src/plugins/ExcelHelper.js rename to plugins/ExcelHelper.js diff --git a/src/plugins/ExcelHelper/createExcelFile.js b/plugins/ExcelHelper/createExcelFile.js similarity index 100% rename from src/plugins/ExcelHelper/createExcelFile.js rename to plugins/ExcelHelper/createExcelFile.js diff --git a/src/plugins/ExcelHelper/xlsx.js b/plugins/ExcelHelper/xlsx.js similarity index 100% rename from src/plugins/ExcelHelper/xlsx.js rename to plugins/ExcelHelper/xlsx.js diff --git a/src/plugins/HTMLParser.js b/plugins/HTMLParser.js similarity index 100% rename from src/plugins/HTMLParser.js rename to plugins/HTMLParser.js diff --git a/src/plugins/JSzip/JSzip.js b/plugins/JSzip/JSzip.js similarity index 100% rename from src/plugins/JSzip/JSzip.js rename to plugins/JSzip/JSzip.js diff --git a/src/plugins/JSzip/zipper.js b/plugins/JSzip/zipper.js similarity index 100% rename from src/plugins/JSzip/zipper.js rename to plugins/JSzip/zipper.js diff --git a/plugins/LICENSE b/plugins/LICENSE new file mode 100644 index 0000000..8e5e18a --- /dev/null +++ b/plugins/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 KonghaYao 江夏尧 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/plugins/Request.js b/plugins/Request.js similarity index 100% rename from src/plugins/Request.js rename to plugins/Request.js diff --git a/src/plugins/index.js b/plugins/index.js similarity index 100% rename from src/plugins/index.js rename to plugins/index.js diff --git a/plugins/package.json b/plugins/package.json new file mode 100644 index 0000000..22bb6ed --- /dev/null +++ b/plugins/package.json @@ -0,0 +1,18 @@ +{ + "name": "@js-spider/plugins-core", + "version": "0.7.2", + "main": "dist/JSpider.esm.min.js", + "unpkg": "dist/JSpider.esm.min.js", + "author": "KonghaYao ", + "description": "JSpider 3 的插件", + "homepage": "http://dongzhongzhidong.gitee.io/jspider/", + "license": "Apache-2.0", + "keywords": [ + "spider", + "javascript", + "web", + "crawl", + "browser", + "front-end" + ] +} diff --git a/src/plugins/utils/cartesianProductOf.js b/plugins/utils/cartesianProductOf.js similarity index 100% rename from src/plugins/utils/cartesianProductOf.js rename to plugins/utils/cartesianProductOf.js diff --git a/src/plugins/utils/toFile.js b/plugins/utils/toFile.js similarity index 100% rename from src/plugins/utils/toFile.js rename to plugins/utils/toFile.js diff --git a/src/plugins/zipFile.js b/plugins/zipFile.js similarity index 100% rename from src/plugins/zipFile.js rename to plugins/zipFile.js diff --git a/src/ControlPanel/ControlPanel.js b/src/ControlPanel/ControlPanel.js index b7eaa1a..d343451 100644 --- a/src/ControlPanel/ControlPanel.js +++ b/src/ControlPanel/ControlPanel.js @@ -74,7 +74,7 @@ export class ControlPanel { startFlow() { this.$EventHub.emit('Flow:start'); } - // TODO 测试暂停功能 + stopFlow() { this.$EventHub.emit('Flow:stop'); } diff --git a/src/TaskSystem/TaskDesign.drawio b/src/TaskSystem/TaskDesign.drawio index 901ce6d..12cdbd2 100644 --- a/src/TaskSystem/TaskDesign.drawio +++ b/src/TaskSystem/TaskDesign.drawio @@ -1,6 +1,6 @@ - + - + @@ -8,18 +8,13 @@ - + - - - - - - - + + - + diff --git a/src/index.js b/src/index.js index f3b6b2a..5d7c832 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import { Spider } from './Spider/index'; -import * as plugins from './plugins/index.js'; +import * as plugins from '../plugins/index.js'; import * as tools from './tools/index.js'; // 工具都是 $ 开头的函数 import { Plugin } from './Pipeline/PluginSystem'; import { Task, TaskGroup } from './TaskSystem/index'; diff --git a/src/utils/EventHub.js b/src/utils/EventHub.js index 01b0457..ae7b5cf 100644 --- a/src/utils/EventHub.js +++ b/src/utils/EventHub.js @@ -6,13 +6,17 @@ import { fromEventPattern } from 'rxjs'; import { memoize } from 'lodash-es'; +/** + * EventHub 是一个事件处理中心,用于事件的接收与派发 + */ + export class EventHub { all = new Map(); constructor(eventMap = {}, bindThis = null) { this.bindThis = bindThis || globalThis; this.on(eventMap); - // 创建一个 rxjs 流源头 + // createSource$ 创建一个 rxjs 流的源头监听相应的事件 this.createSource$ = memoize((eventName) => { return fromEventPattern( (handle) => this.on(eventName, handle), @@ -20,12 +24,23 @@ export class EventHub { ); }); } + + /** + * #on 是单个事件绑定函数,type 与 handle 函数一一对应 + */ #on(type, handler) { const handlers = this.all.get(type); // ! 注意,栈的结构,这里要使用 unshift 将元素插入到头部,这样触发的时候才会最后执行最先声明的函数作为默认函数 // 栈的结构可以保证 在 destroy 事件的时候,首先定义的 destroy 可以最后执行,保证后面绑定 destroy 事件的函数可以先触发,而在 destroy 的定义函数中可以最后 off('*') 解除事件 handlers ? handlers.unshift(handler) : this.all.set(type, [handler]); } + + /** + * on 函数重载,第一个参数可以为一个事件绑定对象, + * on({eventName: callback }) + * on({eventName: [callback] }) + * on(type,handle) + */ on(type, handler) { // 函数重载 if (typeof type === 'string') { @@ -35,12 +50,16 @@ export class EventHub { Object.entries(type).forEach(([key, value]) => { if (value instanceof Array) { value.forEach((item) => this.#on(key, item)); - } else { + } else if (value instanceof Function) { this.#on(key, value); } }); } } + + /** + * off 函数 type 设置为 '*' 时删除所有函数 + */ off(type, handler) { if (type === '*') { return this.all.clear(); @@ -61,9 +80,4 @@ export class EventHub { }) : []; } - - operators = { - // TODO EventHub 中对于 rxjs 流的支持 - EmitWhen(config) {}, - }; } diff --git a/src/utils/functionQueue.js b/src/utils/functionQueue.js index d2648f8..8cdd000 100644 --- a/src/utils/functionQueue.js +++ b/src/utils/functionQueue.js @@ -3,14 +3,13 @@ * Copyright 2021 KonghaYao 江夏尧 * SPDX-License-Identifier: Apache-2.0 */ + /** * 函数用途描述 - * 这个是用于 async 函数队列 连续执行的函数,只要 enQueue 之后就会连续执行,直至停止 + * 这个是用于 async 函数队列 连续执行的函数,只要 enQueue 之后就会连续执行,直至完成 */ - export class functionQueue { QueuePromise = Promise.resolve(); - constructor() {} enQueue(...args) { this.QueuePromise = args.reduce((promise, current) => { return promise.then(current);