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

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

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

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

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

解决方案:

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

 'use strict';
const electron = require('electron');
const app = electron.app;
const CrawlService = require('./libs/crawlService'); //start crawl service
CrawlService.start(); // adds debug features like hotkeys for triggering dev tools and reload
require('electron-debug')(); // prevent window being garbage collected
let mainWindow; function onClosed() {
// dereference the window
// for multiple windows store them in an array
mainWindow = null;
} function createMainWindow() {
const win = new electron.BrowserWindow({
width: 1200,
height: 800
}); win.loadURL(`file://${__dirname}/static/index.html`);
win.openDevTools();
win.on('closed', onClosed); return win;
} app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
}); app.on('activate', () => {
if (!mainWindow) {
mainWindow = createMainWindow();
}
}); app.on('ready', () => {
mainWindow = createMainWindow();
})

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

const request = require('request'),
async = require('async'),
ipcMain = require('electron').ipcMain,
db = require('./dbService'),
cheerio = require('cheerio'); const CrawlService = {
start: function () {
ipcMain.on('search-keyword', function (event, keyword) {
console.log('channel "search-keyword" on msg:' + keyword); let match = {$regex: eval('/' + keyword + '/')};
var query = keyword ? {$or: [{title: match}, {content: match}]} : {};
db.find(query).sort({publishDate: -1}).limit(100).exec(function (err, mails) {
event.sender.send('search-reply', {mails: mails});
});
}); ipcMain.on('start-crawl', (event, arg) => {
console.log('channel "start-crawl" on msg:' + arg);
var updater = {
sender: event.sender,
channel: arg,
updateProgress: function (progress) {
this.sender.send(this.channel, {progress: progress});
}
};
crawler(updater);
});
}
}; function UrlCrawler(targetUrl) {
return {
targetUrl: targetUrl,
startCrawl: function (processDom) {
request(this.targetUrl, (err, response, body) => {
if (err) throw err;
var $ = cheerio.load(body);
processDom($)
});
}
};
} function pageCrawl(page, totalPage, updater, crawlNextPage, crawProgress) {
new UrlCrawler('http://12345.chengdu.gov.cn/moreMail?page=' + page).startCrawl(($) => {
var $pageMails = $('div.left5 ul li.f12px'),
sameMailsInPage = 0; async.eachOfLimit($pageMails, 10, function iteratee(item, key, nextMail) {
if(crawProgress.skip){
return nextMail();
}
let $item = $(item),
mailDetailUrl = $item.find('a').prop('href'),
divs = $item.find('div');
var mail = {
_id: mailDetailUrl.match(/\d+/g)[0],
title: $(divs[0]).text().trim(),
sender: $(divs[1]).text().trim(),
receiveUnit: $(divs[2]).text().trim(),
status: $(divs[3]).text().trim(),
category: $(divs[4]).text().trim(),
views: $(divs[5]).text().trim()
}; new UrlCrawler('http://12345.chengdu.gov.cn/' + mailDetailUrl).startCrawl(($) => {// crawl mail detail
mail.content = $($('.rightside1 td.td2')[1]).text().trim();
mail.result = $('.rightside1 tbody tr:last-child').text().trim();
mail.publishDate = $($('.rightside1 td.td32')[0]).text().trim() || $($('.rightside1 td.td32')[1]).text().trim(); console.log(mail._id); db.update({_id: mail._id}, mail, {upsert: true, returnUpdatedDocs: true}, function (err, numReplaced, affectedDocuments, upsert) {
if (err) {
throw err;
}
if(!upsert && affectedDocuments.result == mail.result){//if a mail are not update
if(++sameMailsInPage == 15){ //if all mails in one page are note update.
crawProgress.skip = true;
}
}
}); nextMail();
});
}, function done() {
crawlNextPage();
updater.updateProgress(Math.floor(page * 100 / totalPage));
});
});
} /**
* 1. get total page size
* 2. iterator from page 1 to totalSize
* 2.1 fetch mails summary list on 1 page
* 2.2 iterator from mails 1 to maxItems mails summary in 1 page
* 2.2.1 fetch mails detail from url
* 2.2.2 save mail to db
* 2.3 test if none of mails in current page updated? if none, stop crawling or continue step 2.
*
* @param url
*/
function crawler(updater) {
new UrlCrawler('http://12345.chengdu.gov.cn/moreMail').startCrawl(($) => {
var totalSize = $('div.pages script').html().match(/iRecCount = \d+/g)[0].match(/\d+/g)[0],
totalPageSize = Math.ceil(totalSize / 15),
pagesCollection = [],
crawProgress = {skip: false};
for (let i = 1; i <= totalPageSize; i++) {
pagesCollection.push(i);
}
async.eachSeries(pagesCollection, function (page, crawlNextPage) {
pageCrawl(page, totalPageSize, updater, crawlNextPage, crawProgress);
})
});
} 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. Linux基础--------centos7 安装python3(yum安装)

    #安装sqlite-devel yum -y install sqlite-devel #安装依赖 yum -y install make zlib zlib-devel gcc-c++ libtoo ...

  2. 传说中的 SonarLint

    Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的 ...

  3. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) A B C D 暴力 水 二分 几何

    A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. 题解 P2598 【[ZJOI2009]狼和羊的故事】

    P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...

  5. 第2章-Vue.js指令

    一.学习目标 了解 什么 是 Vue.js 指令 理解 Vue.js 指令的 用途 掌握 Vue.js 指令的书写规范 能够 使用 Vue.js 指令完成部门页面交互效果(难点和重点) 二.指令的基本 ...

  6. C语言基本类型的字节数

  7. nginx 初探 之反向代理

    首先要解释的是什么叫做反向代理? 平时我们浏览网页可以输入网址直接访问,  但如果访问国外的网站,  可能就没那么简单('中国特色'),  这时候我们需要配置一个代理服务器, 然后通过此服务器中转来访 ...

  8. 微信小程序开发(一)准备开发环境

    1.成为微信公众平台开发者 成为微信公众平台的开发者,是小程序开发的首要条件.只有成为微信公众平台的开发者,才可以使用公众平台的各种开发接口.如果你已经是开发者,则可以跳过本章. (1)进入微信公众平 ...

  9. 七牛云 PHP SDK服务器鉴权失败!参数解释

    昨天搞了一下午,用7牛官方的SDK demo 1.上传凭证 $policy = array( 'callbackUrl' => 'http://api.example.com/qiniu/upl ...

  10. Redis数据类型之字符串(string)

    1. string类型简介 string类型是二进制安全的,能够存储任意类型的字符串. string类型是最常用到的数据类型,一种常用的用法就是将对象格式化为JSON字符串然后放到redis中,取出来 ...