司徒正美

Results 147 issues of 司徒正美

阶段1 支持4个平台的编译, 完成4个平台专用的React API对象(wx, my, swan)都以wx为模板进行兼容化处理,远程请求API 都Promise化 提供强大的webview支持 提供登录,支付支持 sass, less转译支持,提交审核平台前的压缩处理 到此为止,实现一处代码,四处运行 阶段2 对个别频道提供webview编译与小程序编译两种方式 ,webview编译即对这个频道下的所有页面变成一个SPA,放在另一个服务器,通过webview加载 添加H5编译, 即生成H5 touch端代码 基于H5编译,添加SharedWorker, 实现PWA端 提供统一的JSJDK 由于微信小程序是提供一套组件库的,切换成H5,因此也会打造一套对应的组件库 编译器需要考虑做成一个webpack插件,利用社区的力量加快编译速度 完成一套单元测试工具 到此为止,实现一处代码,六处运行 阶段3 添加typescript支持与postcss支持 基于H5编译,通过hybird技术打包,生成跨ios, android的App端 到此为止,实现一处代码,八处运行

上一次升级中已经可以对不同的React Hooks进行tree shaking。tree shaking需要对框架内部模块的依赖进行梳理,由表至内。

首先从app.js开始转译 ```jsx import React from '@react'; import './pages/index/index'; //pages页面全部变成config.pages中的字符串 import './pages/aaa/index'; // pages页面全部变成config.pages中的字符串 import './pages/bbb/index'; //pages页面全部变成config.pages中的字符串 class Global extends React.Component { globalData = {} static config = { window: {...

主要参见外国人的例子,https://www.youtube.com/watch?v=4b8jxigTfRI&feature=youtu.be&a= ```html var container = document.getElementById('root'); var div = container; if (!window.ReactDOM) { window.ReactDOM = React; } var expect = function(a) { return { toBe: function(b) { console.log(a, 'vs', b,...

10.23 ~ 10.28要做的事 * 重写三套模板,让支持快应用 * 写一整套支持快应用的组件 * 启用babel7,搞定中文转义问题 * 内置webview组件 * 模板的开发目录改成source,生产目录视构建目标有所不同(快应用为src, 其他为dist)

### 链表排序 最后我们看一下链表排序。排序时,我们不能使用任何访问link[index]的排序算法,因此有如下排序方法入围。 #### 插入排序 将链表分明两部分,有序与未排序,每次从未排序区取得第一个,在有序区中找到适合位置进行插入 ```javascript function insertSort(list) { let head = list.head; //如果没有或只有一个节点,直接返回 if (!head || !head.next){ return; } let lastSorted = head;//排好序的最后一个 while (lastSorted.next) {//如果还有下一个 let firstUnsort...

## 表达式求值 表达式求值是程序设计语言中的一个最基本问题。它的实现是栈应用的又一个典型例子。这里介绍一种简单直观、广为使用的算法,通常称为“算符优先法”。 要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式。例如要对下述表达式求值: >4+(6-10+2*2)*2 首先,要了解算术四则运算的规则。即: 1. 先乘除,后加减; 2. 从左算到右 3. 先括号内,后括号外 由此,这个算术表达式的计算顺序应为: >4+(6-10+2*2)*2 = 4+(-4+2*2)*2 = 4+(-4+4)*2 = 4+0*2 = 4+0 = 4 1 任何一个表达式都是由操作数(operand)、运算符(operator)和界限符(delimiter)组成。界限符也就是小括号,运算符包括加减乘除,以及更复杂的求余、三角函数等等。这里我们只讨论比较简单的算术表达式,只包括加减乘除四种运算符。 我们把运算符和界限符统称为算符,根据上述3条运算规则,在运算每一步中,任意两个相继出现的算符θ1和θ2之间的优先关系至多是下面三种关系之一: * θ1 <...

## 3.6 散列 散列又叫哈希表,其实是我们前端人最常用的结构了,因为javascript的对象就是一个散列。在实现链表,我们使用insertAt, 来指定数据放入某个位置上。但这个要遍历内部的结构,即便使用了双向链表,其查找速度还是无法与数组相比拟。但数组也有问题,它是查找容易,插入和删除困难;链表则是查找困难,插入和删除容易。 基于这原因,前辈们通过某种算法将关键字转换成数字,实现O(1)的插入删除与查找,综合上两者优点,这就是散列。 ![\[图片\]][17] 下面是完整的定义 散列法存储的线性表被称为哈希表,使用的函数被称为散列函数或者哈希函数,f(k)被称为散列地址或者哈希地址。通常情况下,散列表的存储空间是一个一维数组,而其哈希地址为数组的下标。散列表中的一个位置称为槽(slot)。 我们的重点是设计哈希函数。 哈希函数的选择原则: 1:若哈希函数是一个一一对应的函数,则在查找时,只需要根据哈希函数对给定关键字的某种运算得到待查找结点的存储位置,无需进行比较 2:一般情况下,散列表的空间要比结点的集合大,虽然浪费了一部分空间但是却提高了查找的效率,散列表空间为m,填入表中结点数为n,则比值n/m成为哈希表的装填因子,一般取0.65~0.9之间 3:哈希函数应当尽量简单,其值域必须在表长的范围之内,尽量不要产生“冲突”(两个关键字得到相同的哈希地址) 以下有这几利方法: 直接地址法:以关键字的某个线性函数值为哈希地址,可以表示为hash(K)=aK+C;优点是不会产生冲突,缺点是空间复杂度可能会较高,适用于元素较少的情况 除留余数法:它是由数据元素关键字除以某个常数所留的余数为哈希地址,该方法计算简单,适用范围广,是经常使用的一种哈希函数,可以表示为:hash(K)=K mod C; 数字分析法:该方法是取数据元素关键字中某些取值较均匀的数字来作为哈希地址的方法,这样可以尽量避免冲突,但是该方法只适合于所有关键字已知的情况,对于想要设计出更加通用的哈希表并不适用 平方求和法:对当前字串转化为Unicode值,并求出这个值的平方,去平方值中间的几位为当前数字的hash值,具体取几位要取决于当前哈希表的大小。 分段求和法:根据当前哈希表的位数把所要插入的数值分成若干段,把若干段进行相加,舍去调最高位结果就是这个值的哈希值。 一个简单哈希函数不做冲突处理的哈希表实现 ```javascript class Hash { constructor() { this.table...

## 冒泡排序 ```javascript //这个方法非常常用,其他章节都会用到,以后就省略不写 function swap(array, a, b) { var temp = array[a]; array[a] = array[b]; array[b] = temp; } function bubbleSort1(array) { var n = array.length for (var i...