孙同生的博客

为美好的世界献上祝福

  • 首页
  • 标签
  • 分类
  • 归档
  • d3学习demo演示
  • 搜索

create-react-app教程-源码篇

发表于 2018-11-29 | 更新于 2019-03-06 | 分类于 quick-start , create-react-app教程 | 评论数: | 阅读次数:
本文字数: 42k | 阅读时长 ≈ 39 分钟

之前在 create-react-app教程-使用篇 中介绍了create-react-app的基本使用,
为了便于理解一个脚手架脚本是如何运作的,现在来看一下 create-react-app v1.5.2 的源码

入口index.js

create-react-app 一般会作为全局命令,因为便于更新等原因,create-react-app 只会做初始化仓库 执行当前版本命令等操作。

找到 create-react-app 入口index文件:

阅读全文 »

create-react-app教程-使用篇

发表于 2018-11-28 | 更新于 2019-03-06 | 分类于 quick-start , create-react-app教程 | 评论数: | 阅读次数:
本文字数: 12k | 阅读时长 ≈ 11 分钟

是不是厌倦了每次新建web项目繁琐的配置,想不想只用10秒搭建就搭建一个完整的react项目?

阅读全文 »

(转)浏览器的工作原理-现代浏览器幕后

发表于 2018-11-27 | 分类于 essay , 转载 | 评论数: | 阅读次数:
本文字数: 68k | 阅读时长 ≈ 1:02

原文地址: How Browsers Work: Behind the scenes of modern web browsers

序言

这是一篇全面介绍 WebKit 和 Gecko 内部操作的入门文章,是以色列开发人员塔利·加希尔大量研究的成果。在过去的几年中,她查阅了所有公开发布的关于浏览器内部机制的数据(请参见资源),并花了很多时间来研读网络浏览器的源代码。她写道:

在 IE 占据 90% 市场份额的年代,我们除了把浏览器当成一个“黑箱”,什么也做不了。但是现在,开放源代码的浏览器拥有了过半的市场份额,因此,是时候来揭开神秘的面纱,一探网络浏览器的内幕了。呃,里面只有数以百万行计的 C++ 代码…

塔利在她的网站上公布了自己的研究成果,但是我们觉得它值得让更多的人来了解,所以我们在此重新整理并公布。

作为一名网络开发人员,学习浏览器的内部工作原理将有助于您作出更明智的决策,并理解那些最佳开发实践的个中缘由。尽管这是一篇相当长的文档,但是我们建议您花些时间来仔细阅读;读完之后,您肯定会觉得所费不虚。

保罗·爱丽诗 (Paul Irish),Chrome 浏览器开发人员事务部

简介

网络浏览器很可能是使用最广的软件。在这篇入门文章中,我将会介绍它们的幕后工作原理。我们会了解到,从您在地址栏输入 google.com 直到您在浏览器屏幕上看到 Google 首页的整个过程中都发生了些什么。

阅读全文 »

GitHub精选分享第一期

发表于 2018-11-23 | 更新于 2018-11-27 | 分类于 每周分享 | 评论数: | 阅读次数:
本文字数: 3.4k | 阅读时长 ≈ 3 分钟

记录这周值得分享的事,主要是GitHub精选 前端相关~

向你的Hexo里放上一只萌萌哒二次元看板娘!

可以在hexo博客右下角添加live2D角色
看板娘列表

阅读全文 »

Babel入门教程

发表于 2018-11-22 | 更新于 2018-12-05 | 分类于 quick-start , Babel教程 | 评论数: | 阅读次数:
本文字数: 25k | 阅读时长 ≈ 23 分钟

大家都知道js十分依赖浏览器(或Node环境),不同浏览器对js的支持不尽相同。现如今ECMAScrip标准的更新已经到了一年一次的节奏,
Babel 就是为了解决这个问题 ,它可以将使用新标准的JavaScript代码转换为浏览器支持可以运行的JavsScript(ES5)代码。

1
2
3
4
5
6
7
8
//例如babel将这段代码
[1, 2, 3].map(n => n ** 2);
//转换为:
"use strict";

[1, 2, 3].map(function (n) {
return n + 1;
});

在webpack中配置Babel

假设在react项目配置webpack:

一、安装npm包:

1
npm install --save-dev babel-loader babel-core babel-plugin-transform-runtime babel-preset-es2015 babel-preset-react webpack-preset-babel-stage-0

二、在webpack配置文件中添加规则:

1
2
3
4
5
module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
]
}

**三、 在项目根目录创建名为.babelrc的文件,这是Babel的配置文件 **

在配置文件中安装插件(plugins)或预设(presets,也就是一组插件)来指示 Babel 去做什么事情。在下面配置中:

babel-preset-es2015 打包了 es6 的特性;
babel-preset-stage-0 打包处于 strawman 阶段的语法;
babel-preset-react 打包react全家桶语法;

Babel 几乎可以编译所有时新的 JavaScript 语法,但对于 APIs 来说却并非如此。例如: Promise、Set、Map 等新增对象,Object.assign、Object.entries等静态方法,babel-plugin-transform-runtime为了达成使用这些新API。

1
2
3
4
5
//.babelrc内容
{
"presets": ["es2015", "stage-0", "react"],
"plugins": ["transform-runtime"]
}

Babel模块

阅读全文 »

Electron入门教程

发表于 2018-11-21 | 更新于 2018-12-07 | 分类于 quick-start , Electron教程 | 评论数: | 阅读次数:
本文字数: 24k | 阅读时长 ≈ 22 分钟

Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。 Electron通过将 Chromium 和 Node.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源码浅读

发表于 2018-01-29 | 更新于 2018-11-28 | 分类于 essay , Redux | 评论数: | 阅读次数:
本文字数: 56k | 阅读时长 ≈ 51 分钟

本文是关于 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这几个函数。

阅读全文 »

RN中布局样式的写法

发表于 2018-01-18 | 更新于 2018-11-23 | 分类于 essay , React Native | 评论数: | 阅读次数:
本文字数: 42k | 阅读时长 ≈ 38 分钟

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

还有比较流行的 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);

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

阅读全文 »

Category结构与原理

发表于 2017-11-29 | 更新于 2019-03-07 | 分类于 重学iOS , Runtime | 评论数: | 阅读次数:
本文字数: 28k | 阅读时长 ≈ 26 分钟

分类的实现原理,编译时的表现,运行时的加载原理
参考文档: 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;
阅读全文 »

Runtime 对象关联原理

发表于 2017-11-22 | 更新于 2019-03-07 | 分类于 重学iOS , Runtime | 评论数: | 阅读次数:
本文字数: 31k | 阅读时长 ≈ 28 分钟

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

对象关联原理

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

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

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

阅读全文 »
<i class="fa fa-angle-left" aria-label="上一页"></i>1…456…9<i class="fa fa-angle-right" aria-label="下一页"></i>
SunTongSheng

SunTongSheng

移动端 前端 跨平台

85 日志
22 分类
27 标签
RSS
© 2026 SunTongSheng | 532k | 8:04