对于electron以及nodejs开发,是一只小菜鸟,第一次想做个应用

只能边学边做,遇到各种各样的问题。

1、不想把所有的主进程函数放到一个文件中,这样文件比较乱,并且不好处理

想法:将另一个js文件引入到该文件中,进行调用等

问题:js不存在互相调用的功能

解决方案:

自定义nodejs模块,并在main.js中导入,然后进行处理(以下代码来自网络)

  1. 'use strict';
  2. const electron = require('electron');
  3. const app = electron.app;
  4. const CrawlService = require('./libs/crawlService');
  5.  
  6. //start crawl service
  7. CrawlService.start();
  8.  
  9. // adds debug features like hotkeys for triggering dev tools and reload
  10. require('electron-debug')();
  11.  
  12. // prevent window being garbage collected
  13. let mainWindow;
  14.  
  15. function onClosed() {
  16. // dereference the window
  17. // for multiple windows store them in an array
  18. mainWindow = null;
  19. }
  20.  
  21. function createMainWindow() {
  22. const win = new electron.BrowserWindow({
  23. width: 1200,
  24. height: 800
  25. });
  26.  
  27. win.loadURL(`file://${__dirname}/static/index.html`);
  28. win.openDevTools();
  29. win.on('closed', onClosed);
  30.  
  31. return win;
  32. }
  33.  
  34. app.on('window-all-closed', () => {
  35. if (process.platform !== 'darwin') {
  36. app.quit();
  37. }
  38. });
  39.  
  40. app.on('activate', () => {
  41. if (!mainWindow) {
  42. mainWindow = createMainWindow();
  43. }
  44. });
  45.  
  46. app.on('ready', () => {
  47. mainWindow = createMainWindow();
  48. })

以上代码中的4、5、6、7行就是引入自定义模块进行处理,自定义模块代码为

  1. const request = require('request'),
  2. async = require('async'),
  3. ipcMain = require('electron').ipcMain,
  4. db = require('./dbService'),
  5. cheerio = require('cheerio');
  6.  
  7. const CrawlService = {
  8. start: function () {
  9. ipcMain.on('search-keyword', function (event, keyword) {
  10. console.log('channel "search-keyword" on msg:' + keyword);
  11.  
  12. let match = {$regex: eval('/' + keyword + '/')};
  13. var query = keyword ? {$or: [{title: match}, {content: match}]} : {};
  14. db.find(query).sort({publishDate: -1}).limit(100).exec(function (err, mails) {
  15. event.sender.send('search-reply', {mails: mails});
  16. });
  17. });
  18.  
  19. ipcMain.on('start-crawl', (event, arg) => {
  20. console.log('channel "start-crawl" on msg:' + arg);
  21. var updater = {
  22. sender: event.sender,
  23. channel: arg,
  24. updateProgress: function (progress) {
  25. this.sender.send(this.channel, {progress: progress});
  26. }
  27. };
  28. crawler(updater);
  29. });
  30. }
  31. };
  32.  
  33. function UrlCrawler(targetUrl) {
  34. return {
  35. targetUrl: targetUrl,
  36. startCrawl: function (processDom) {
  37. request(this.targetUrl, (err, response, body) => {
  38. if (err) throw err;
  39. var $ = cheerio.load(body);
  40. processDom($)
  41. });
  42. }
  43. };
  44. }
  45.  
  46. function pageCrawl(page, totalPage, updater, crawlNextPage, crawProgress) {
  47. new UrlCrawler('http://12345.chengdu.gov.cn/moreMail?page=' + page).startCrawl(($) => {
  48. var $pageMails = $('div.left5 ul li.f12px'),
  49. sameMailsInPage = 0;
  50.  
  51. async.eachOfLimit($pageMails, 10, function iteratee(item, key, nextMail) {
  52. if(crawProgress.skip){
  53. return nextMail();
  54. }
  55. let $item = $(item),
  56. mailDetailUrl = $item.find('a').prop('href'),
  57. divs = $item.find('div');
  58. var mail = {
  59. _id: mailDetailUrl.match(/\d+/g)[0],
  60. title: $(divs[0]).text().trim(),
  61. sender: $(divs[1]).text().trim(),
  62. receiveUnit: $(divs[2]).text().trim(),
  63. status: $(divs[3]).text().trim(),
  64. category: $(divs[4]).text().trim(),
  65. views: $(divs[5]).text().trim()
  66. };
  67.  
  68. new UrlCrawler('http://12345.chengdu.gov.cn/' + mailDetailUrl).startCrawl(($) => {// crawl mail detail
  69. mail.content = $($('.rightside1 td.td2')[1]).text().trim();
  70. mail.result = $('.rightside1 tbody tr:last-child').text().trim();
  71. mail.publishDate = $($('.rightside1 td.td32')[0]).text().trim() || $($('.rightside1 td.td32')[1]).text().trim();
  72.  
  73. console.log(mail._id);
  74.  
  75. db.update({_id: mail._id}, mail, {upsert: true, returnUpdatedDocs: true}, function (err, numReplaced, affectedDocuments, upsert) {
  76. if (err) {
  77. throw err;
  78. }
  79. if(!upsert && affectedDocuments.result == mail.result){//if a mail are not update
  80. if(++sameMailsInPage == 15){ //if all mails in one page are note update.
  81. crawProgress.skip = true;
  82. }
  83. }
  84. });
  85.  
  86. nextMail();
  87. });
  88. }, function done() {
  89. crawlNextPage();
  90. updater.updateProgress(Math.floor(page * 100 / totalPage));
  91. });
  92. });
  93. }
  94.  
  95. /**
  96. * 1. get total page size
  97. * 2. iterator from page 1 to totalSize
  98. * 2.1 fetch mails summary list on 1 page
  99. * 2.2 iterator from mails 1 to maxItems mails summary in 1 page
  100. * 2.2.1 fetch mails detail from url
  101. * 2.2.2 save mail to db
  102. * 2.3 test if none of mails in current page updated? if none, stop crawling or continue step 2.
  103. *
  104. * @param url
  105. */
  106. function crawler(updater) {
  107. new UrlCrawler('http://12345.chengdu.gov.cn/moreMail').startCrawl(($) => {
  108. var totalSize = $('div.pages script').html().match(/iRecCount = \d+/g)[0].match(/\d+/g)[0],
  109. totalPageSize = Math.ceil(totalSize / 15),
  110. pagesCollection = [],
  111. crawProgress = {skip: false};
  112. for (let i = 1; i <= totalPageSize; i++) {
  113. pagesCollection.push(i);
  114. }
  115. async.eachSeries(pagesCollection, function (page, crawlNextPage) {
  116. pageCrawl(page, totalPageSize, updater, crawlNextPage, crawProgress);
  117. })
  118. });
  119. }
  120.  
  121. module.exports = CrawlService;

electron主进程引入自定义模块的更多相关文章

  1. Visual Studio Code调试electron主进程

    Visual Studio Code调试electron主进程 作者: jekkay 分类: electron 发布时间: 2017-06-11 14:56  一·概述 此文原出自[水滴石]: htt ...

  2. 研究Electron主进程、渲染进程、webview之间的通讯

    背景 由于某个Electron应用,需要主进程.渲染进程.webview之间能够互相通讯. 不过因为Electron仅提供了主进程与渲染进程的通讯,没有渲染进程之间或渲染进程与webview之间通讯的 ...

  3. electron 主进程,和渲染进程的通信

    ipcMain https://electronjs.org/docs/api/ipc-main 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息, 当然也有可能从主进程向渲染进 ...

  4. python引入自定义模块

    Python的包搜索路径 Python会在以下路径中搜索它想要寻找的模块:1. 程序所在的文件夹2. 标准库的安装路径3. 操作系统环境变量PYTHONPATH所包含的路径 将自定义库的路径添加到Py ...

  5. Python 如何引入自定义模块

    Python 中如何引用自己创建的源文件(*.py)呢? 也就是所谓的模块. 假如,你有一个自定义的源文件,文件名:saySomething.py .里面有个函数,函数名:sayHello.如下图: ...

  6. 使用Visual Studio Code调试Electron主进程

    1.打开VS Code,使用文件->打开,打开程序目录 2.切换到调试选项卡 3.打开launch.json配置文件 4.在“附加到进程”节点上增加localhost配置 5.使用命令行启动el ...

  7. [转]Python如何引入自定义模块?

    转自 http://www.cnblogs.com/JoshuaMK/p/5205398.html Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新 ...

  8. Python如何引入自定义模块?

    Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新的类库,主要有以下四种方法: 1.在sys.path列表中添加新的路径.这里可以在运行环境中直接修改 ...

  9. 自己实现一个Electron跨进程消息组件

    我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...

随机推荐

  1. [vim]乱码问题

    在vim输入中文乱码 1. 检查系统是否支持中文 locale -a 没有中文支持 安装中文包 apt-get install language-pack-zh-hans -y 2.这样可以输入中文了 ...

  2. C++引用C程序库函数

    C与C++混合编程 C++里面如何声明const void f(void)函数为C程序中的库函数. void f(void)用c++ compiler来编译,在产生的obj文件中的名字变成了 $f@@ ...

  3. 手脱nSPack 1.3

    1.PEID查壳 nSPack 1.3 -> North Star/Liu Xing Ping 2.载入OD,pushad下面的call哪里使用ESP定律,下硬件访问断点,然后shift+F9运 ...

  4. Java设计模式の责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. poj 3164 Command Network(最小树形图模板)

    Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS   Memory Limit: 131072K Total Subm ...

  6. HDU 5145 分块 莫队

    给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...

  7. Anagrams by Stack(深度优先搜索)

    ZOJ Problem Set - 1004 Anagrams by Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB How can a ...

  8. Centos7系统环境下Solr之Java实战(一)搭建solr服务器

    搭建步骤 1.分别上传tomcat.sorl到指定文件夹并解压 2.把solr部署到Tomcat下 通过命令 cp apache-tomcat-7.0.47 /usr/local/sorl/tomca ...

  9. 【洛谷 P2764】 最小路径覆盖问题(最大流)

    题目链接 首先有\(n\)条路径,每条路径就是一个点,然后尽量合并,答案就是点数-合并数. 套路拆点,源连入,出连汇,原有的边入出连. 最大流就是最大合并数,第一问解决. 然后怎么输出方案? 我是找到 ...

  10. NYOJ 1073 最大值 (模拟)

    题目链接 输入N个数,M次查询. 每次查询给出一个数x. 要求:每次查询输出前x个数中第i小的数.(i为第i次查询) 你可以假设M <= N,Xi <= Xi+1 <= Xi+2 & ...