孙同生的博客

为美好的世界献上祝福

Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。 Electron通过将 ChromiumNode.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的。

相信大部分前端同学都听说或者了解过NodeJs 它是一个基于Chrome V8 引擎的JavaScript运行时, 而 Chromium 是Google为发展自家浏览器Chrome而开启的开源浏览器项目,可以看成是是Chrome的先行版。大家较为熟悉的VS Code 和 Atom就是使用Electron来完成的。

从开发的角度来看, Electron application 本质上是一个 Node. js 应用程序。可以让前端开发者让你使用纯 JavaScript 调用丰富的原生操作系统APIs来创造桌面应用~

Quick Start

确认你的网络可以访问github , 若访问受限参考 安装指南 来了解如何用代理、镜像和自定义缓存

你肯定已经已经安装好git和node了,那么只要:

1
2
3
4
5
6
# 官网已经有 electron-quick-start 仓库克隆下来
git clone https://github.com/electron/electron-quick-start
# 进入文件夹
cd electron-quick-start
# 安装依赖包并运行
npm install && npm start

然后你的第一个桌面应用就开启了!

若你跟着一起实践到这里,肯定会发现界面有些许不同?我这里多了个调试界面,那么来看下代码看看。在Electron中main.js是入口文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//main.js
const { app, BrowserWindow } = require('electron')

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win

function createWindow () {
// 创建浏览器窗口。
win = new BrowserWindow({ width: 800, height: 600 })

// 然后加载应用的 index.html。对应的index.html 就是初始界面。
win.loadFile('index.html')

// 打开开发者工具
win.webContents.openDevTools()

//关于win 窗口的生命周期我们之后再研究……
// 当 window 被关闭,这个事件会被触发。
win.on('closed', () => {
// 取消引用 window 对象,如果你的应用支持多窗口的话,
// 通常会把多个 window 对象存放在一个数组里面,
// 与此同时,你应该删除相应的元素。
win = null
})
}
//关于 app 主进程的生命周期我们之后再研究……
// Electron 会在初始化后并准备
// 创建浏览器窗口时,调用这个函数。
// 部分 API 在 ready 事件触发后才能使用。
app.on('ready', createWindow)

// 当全部窗口关闭时退出。
app.on('window-all-closed', () => {
// 在 macOS 上,除非用户用 Cmd + Q 确定地退出,
// 否则绝大部分应用及其菜单栏会保持激活。
if (process.platform !== 'darwin') {
app.quit()
}
})

app.on('activate', () => {
// 在macOS上,当单击dock图标并且没有其他窗口打开时,
// 通常在应用程序中重新创建一个窗口。
if (win === null) {
createWindow()
}
})

// 在这个文件中,你可以续写应用剩下主进程代码。
// 也可以拆分成几个文件,然后用 require 导入。

与现有React工程结合

迫于不会Vue ,在这里介绍下React工程如何和Electron结合起来。

阅读全文 »

本文是关于 redux(3.7.2)源代码的一些浅读

redux源码目录中 ,可以看到以下文件目录:

1
2
3
4
5
6
7
8
|-- utils/
|-- warning.js //打印error
|-- 1. applyMiddleware.js //
|-- 2. bindActionCreators.js //
|-- 3. combineReducers.js //
|-- 4. compose.js //
|-- 5. createStore.js //
|-- index.js //入口文件

与文件对应的,主要也是介绍 createStore compose combineReducers bindActionCreators applyMiddleware这几个函数。

阅读全文 »

介绍原始写法 & 及其改进写法一

还有比较流行的 styled-components在RN中的使用 & 及其改进写法二

1.原写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 原写法
*/
const styles1 = StyleSheet.create({
item1:{
width:100,
height:200,
backgroundColor:'#66CCFF',
},
item2:{
width:100,
height:200,
backgroundColor:'#66CCFF',
},
item3:{
width:50,
height:100,
top:50,
left:25,
backgroundColor:'#66CCFF',
}
});
console.log('styles1 :',styles1);

原写法的缺点在于变量不好引入,不好体现样式间的关系,没有计算表达式等……

阅读全文 »

分类的实现原理,编译时的表现,运行时的加载原理
参考文档: objc4-723

category的主要作用是为已经存在的类添加方法。可以把类的实现分开在几个不同的文件里面。

Category 结构体

Category用Category_t结构体定义:

1
2
3
4
5
6
7
8
typedef struct category_t {
const char *name;//类的名字
classref_t cls;//类
struct method_list_t *instanceMethods;//实例方法的列表
struct method_list_t *classMethods;//类方法的列表
struct protocol_list_t *protocols;//所有协议的列表
struct property_list_t *instanceProperties;//添加的所有属性
} category_t;
阅读全文 »

介绍 对象关联,以及如何为Category添加weak属性
apple open source

对象关联原理

创建一个类的分类Category,并添加一个属性CategoryProperty,分类中的@CategoryProperty并没有帮我们生成实例变量以及存取方法,要求我们手动实现,这时候就需要用到对象关联。

在分类中,因为类的实例变量的布局已经固定,使用 @property 已经无法向固定的布局中添加新的实例变量(这样做可能会覆盖子类的实例变量),所以我们需要使用关联对象以及两个方法来模拟构成属性的三个要素。

关联对象又是如何实现并且管理的呢:

阅读全文 »

本文主要讲使用IP代理防止爬虫被禁

python爬虫中爬取到大约184条数据后,zhipin网站就会采取链接重定向方式 阻止爬取。如果在代码中取消登录操作 , 直接爬取到大约92条数据,你的 IP 就会被封啦~

为了防止这个悲剧发生 根据Scarpy https://doc.scrapy.org/en/latest/topics/practices.html?highlight=banned#avoiding-getting-banned 有以下几个建议:

阅读全文 »

scrapy基础实例,爬取zhipin网站信息

scarpy的新建 + scarpy模拟登录 + 在pipeline中存取信息到sqlite3 +xpath解析页面

scrapy新建工程

1
scrapy startproject projectName

具体可以查看 python3爬虫学习

发现 parse 或者 start_requests是爬虫的入口

解析html

阅读全文 »

python3 爬虫

创建爬虫

BeautifulSoup

网络连接

1
2
from urllib.request import urlopen
html = urlopen("http://pythonscraping.com/pages/page1.html") print(html.read())

BeautifulSoup

中文文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

阅读全文 »

Serialization 包括 AFURLResponseSerializationAFURLRequestSerialization

AFURLResponseSerialization 是处理响应的模块,将请求返回的数据解析成对应的格式。而AFURLRequestSerialization的主要作用是修改请求(主要是 HTTP 请求)的头部,提供了一些语义明确的接口设置 HTTP 头部字段。

AFURLResponseSerialization

AFURLResponseSerialization 是一个协议,协议的内容为:

1
2
3
- (nullable id)responseObjectForResponse:(nullable NSURLResponse *)response
data:(nullable NSData *)data
error:(NSError * _Nullable __autoreleasing *)error NS_SWIFT_NOTHROW;

它的实现类为:

  • AFURLResponseSerialization
    • AFHTTPResponseSerializer
      • AFJSONResponseSerializer
      • AFXMLParserResponseSerializer
      • AFXMLDocumentResponseSerializer
      • AFPropertyListResponseSerializer
      • AFImageResponseSerializer
      • AFCompoundResponseSerializer

在文件中 所有类都遵循AFURLResponseSerialization,而AFHTTPResponseSerializer是其他类的基类。

阅读全文 »
0%