electron主进程引入自定义模块
对于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主进程引入自定义模块的更多相关文章
- Visual Studio Code调试electron主进程
Visual Studio Code调试electron主进程 作者: jekkay 分类: electron 发布时间: 2017-06-11 14:56 一·概述 此文原出自[水滴石]: htt ...
- 研究Electron主进程、渲染进程、webview之间的通讯
背景 由于某个Electron应用,需要主进程.渲染进程.webview之间能够互相通讯. 不过因为Electron仅提供了主进程与渲染进程的通讯,没有渲染进程之间或渲染进程与webview之间通讯的 ...
- electron 主进程,和渲染进程的通信
ipcMain https://electronjs.org/docs/api/ipc-main 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息, 当然也有可能从主进程向渲染进 ...
- python引入自定义模块
Python的包搜索路径 Python会在以下路径中搜索它想要寻找的模块:1. 程序所在的文件夹2. 标准库的安装路径3. 操作系统环境变量PYTHONPATH所包含的路径 将自定义库的路径添加到Py ...
- Python 如何引入自定义模块
Python 中如何引用自己创建的源文件(*.py)呢? 也就是所谓的模块. 假如,你有一个自定义的源文件,文件名:saySomething.py .里面有个函数,函数名:sayHello.如下图: ...
- 使用Visual Studio Code调试Electron主进程
1.打开VS Code,使用文件->打开,打开程序目录 2.切换到调试选项卡 3.打开launch.json配置文件 4.在“附加到进程”节点上增加localhost配置 5.使用命令行启动el ...
- [转]Python如何引入自定义模块?
转自 http://www.cnblogs.com/JoshuaMK/p/5205398.html Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新 ...
- Python如何引入自定义模块?
Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新的类库,主要有以下四种方法: 1.在sys.path列表中添加新的路径.这里可以在运行环境中直接修改 ...
- 自己实现一个Electron跨进程消息组件
我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...
随机推荐
- [vim]乱码问题
在vim输入中文乱码 1. 检查系统是否支持中文 locale -a 没有中文支持 安装中文包 apt-get install language-pack-zh-hans -y 2.这样可以输入中文了 ...
- C++引用C程序库函数
C与C++混合编程 C++里面如何声明const void f(void)函数为C程序中的库函数. void f(void)用c++ compiler来编译,在产生的obj文件中的名字变成了 $f@@ ...
- 手脱nSPack 1.3
1.PEID查壳 nSPack 1.3 -> North Star/Liu Xing Ping 2.载入OD,pushad下面的call哪里使用ESP定律,下硬件访问断点,然后shift+F9运 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- poj 3164 Command Network(最小树形图模板)
Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS Memory Limit: 131072K Total Subm ...
- HDU 5145 分块 莫队
给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...
- Anagrams by Stack(深度优先搜索)
ZOJ Problem Set - 1004 Anagrams by Stack Time Limit: 2 Seconds Memory Limit: 65536 KB How can a ...
- Centos7系统环境下Solr之Java实战(一)搭建solr服务器
搭建步骤 1.分别上传tomcat.sorl到指定文件夹并解压 2.把solr部署到Tomcat下 通过命令 cp apache-tomcat-7.0.47 /usr/local/sorl/tomca ...
- 【洛谷 P2764】 最小路径覆盖问题(最大流)
题目链接 首先有\(n\)条路径,每条路径就是一个点,然后尽量合并,答案就是点数-合并数. 套路拆点,源连入,出连汇,原有的边入出连. 最大流就是最大合并数,第一问解决. 然后怎么输出方案? 我是找到 ...
- NYOJ 1073 最大值 (模拟)
题目链接 输入N个数,M次查询. 每次查询给出一个数x. 要求:每次查询输出前x个数中第i小的数.(i为第i次查询) 你可以假设M <= N,Xi <= Xi+1 <= Xi+2 & ...