Giter Site home page Giter Site logo

mytac / blogs Goto Github PK

View Code? Open in Web Editor NEW
77.0 77.0 18.0 10.34 MB

just my blogs,只有watch才能追踪!!start只是收藏!!:boom: 更多点击=》

Home Page: https://www.jianshu.com/u/5ed1bc7b3716

JavaScript 96.01% HTML 1.26% Less 2.73%
blog javascript

blogs's People

Contributors

mytac avatar w4ctech avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

blogs's Issues

2017年9月github上值得关注的开源项目

特效处理

  1. Rythm.js -- 一个使您的页面跳舞的JavaScript库。

  2. anime -- JavaScript动画引擎
    Demo

  3. lookforward.js -- 在页面跳转时的一些特效
    Demo

  4. better-scroll -- 一款重点解决移动端(未来可能会考虑 PC 端)各种滚动场景需求的插件。

  5. cssFilters -- 自定义和Instagram喜欢用React创建的CSS的照片过滤器 【官网】

    【Demo】

  6. Liike -- 一个小型的js补间库

    【Demo】

  7. amplify -- 一个允许内嵌图像缩放的小脚本

    【Demo】

  8. draggable -- 使用draggable完全控制拖放行为

    【官网】

ui相关

  1. fitty -- 自适应文字大小

  2. vuetify -- Vue.js的material组件框架2

    【官网】

  3. bosket -- 前端框架的树视图实现库

  4. vant -- 来自YouZan的Vue.js 2.0 Mobile UI

    【官网】

图像影音相关

  1. react-imgpro -- 用于React的图像处理组件
  2. geometry-processing-js -- 用于web上几何处理的快速通用框架。
  3. Youku-HTML5-Player -- 告别flash和广告,Youku HTML5播放器扩展
  4. style2paints -- 新一代线稿上色人工智能AI
  5. winamp2-js -- 在HTML5和Javascript中重新实现Winamp 2.9

服务端相关

  1. r2 -- HTTP客户端
  2. fastify -- 快速和低开销的Web框架,用于Node.js
  3. axios -- 用于浏览器和node.js的基于Promise的HTTP客户端
  4. p-progress -- 用于在长时间运行异步操作时向用户报告进度
  5. nanoevents -- 简单且小巧的事件发射器
import NanoEvents from 'nanoevents'
const emitter = new NanoEvents()

const unbind = emitter.on('tick', volume => {
  summary += volume
})

function disable () {
  unbind()
}

项目开发工具

  1. Lozad -- 高性能、轻的在纯JS中可配置的惰性加载器,不依赖于图像、框架或是其他

    Demo

  2. easy-mock -- 一种持久的服务,可以快速生成模拟数据并提供可视化视图。

  3. create-react-app -- 创建没有构建配置的React应用程序。

  4. drone -- 缺少Android开发人员的lib manager

  5. Nano ID -- 一个小巧,安全的URL友好的JavaScript字符串ID生成器。

    [example]

    var nanoid = require('nanoid')
    model.id = nanoid() //=> "Uakgb_J5m9g~0JDMbcJqLJ"
  6. anu -- 一个高性能、精巧的react扩展库

  7. api-mocker -- 一个接口管理系统

    【官网】

  8. gatsby -- 基于React的静态站点生成器

  9. statty -- 一个微小而不引人注目的状态管理库,用于React和Preact应用

代码分析工具

  1. Iroh -- 动态分析工具,在runtime时拦截、分析和记录javaScript

    【Demo】

  2. babel-plugin-sitrep -- 使用简单的注释记录函数的所有作业和返回值

  3. type-profile -- 收集JavaScript代码的运行时类型信息。

  4. size-limit -- 一个防止js库膨胀的分析工具

  5. cqc -- 代码质量检查器

  6. vue-test-utils -- 用于测试vue组件的程序

文件处理

  1. react-pdf -- 轻松地在您的React应用程序中显示PDF文件。

    Demo

  2. jsPDF -- 在客户端生成pdf

    【Demo】

数据图表相关

  1. D3 -- 使用SVG,Canvas和HTML将数据带入生活
  2. ngraph.path -- 在图表中查找路径
  3. billboard.js -- 一个基于D3 v4 +的可重用的简单界面JavaScript图表库。

博客

  1. clean-code-javascript -- 适用于JavaScript的干净代码概念
  2. front-end-handbook-2017 -- 2017 年,如何学习前端工程,用什么工具来实践?
  3. es6tutorial -- 一本开源的 JavaScript 语言教程,全面介绍 ECMAScript 6 新增的语法特性。
  4. learnVue -- Vue.js源码剖析
  5. tech-interview-handbook -- 面经
  6. iCSS -- 谈谈一些有趣的 CSS 话题
    73 React-Express-Blog-Demo -- React+Express+Mongo ->前后端博客网站

第三方扩展

  1. wp-calypso -- 使用单页Web应用程序对WordPress仪表板进行了美丽的重新设计

  2. Rax -- 通用的React兼容渲染引擎

    【官网】

  3. styled-system -- 把css封装在js中的react组件

  4. wxapp-market -- 小程序营销组件

  5. vue-a11y-calendar -- 无障碍、国际化的vue组件

funny stuff

  1. Storyboarder -- 快速地绘制一个故事,轻松绘制棒状图。

  2. react-powerplug -- 给你的dumb组件生命

  3. Boostnote -- 一个开源的多平台笔记应用程序
    【官网】

  4. build-a-bot-with-zero-coding -- 使用Google表格创建没有后端服务器的Viber调查聊天机器人的示例

  5. AR.js -- 有效的增强现实的网络 - 60fps在手机上!

  6. socket-io-game -- 一个多人在线游戏的例子

    【Demo】

  7. guitar_bro -- 浏览器游戏,帮助您学习吉他

    【Demo】

2017年11月github上值得关注的开源项目

数据图表相关

  1. charts -- 简单,响应迅速,具有零依赖关系的现代SVG图表

    【官网】

  2. tikzcd-editor -- 用于创建可交换图的简单可视化编辑器。

    【Demo】

    example

  3. wasm-particles -- 这是一个视觉基准,每个粒子从WebAssembly更新,然后用WebGL绘制到屏幕上。

    demo

  4. Wade -- 超级快的1kb搜索

  5. lottie-web -- 分析Adobe After Effects动画与Bodymovin一起导出为json,并在移动设备上原生呈现

  6. luxon -- 在JS中使用日期和时间的库

    官网

  7. date-fns -- 现代JavaScript日期实用程序库

  8. g2 -- 支付宝推出的简易图表生成工具G2
    demo

  9. imaskjs -- vanilla js 输入掩码

    示例

UI相关

  1. minui -- 基于规范的小程序 UI 组件库,支持自定义标签组件,轻量、易用、工具化

  2. cube-ui -- 一个梦幻般的移动UI lib由Vue执行

    示例

  3. scrollama -- 用IntersectionObserver滚动查询

    demo

影像处理

  1. chimee -- 一个视频播放器旨在为浏览器带来美妙的体验

    【官网】

  2. voxelengine3 -- Javascript中的体素引擎

    【Demo】

  3. fieldplay -- 矢量字段浏览器。用WebGL制作,爱与激情。这个超酷

    【Demo】

  4. UPNG.js -- 快速和先进的PNG(APNG)解码器和编码器

    示例

  5. animateplus -- 是一个专注于性能和创作灵活性的JavaScript动画库。它的目标是提供稳定的60 FPS,重量小于2 KB(缩小和压缩),使其特别适合移动设备。

    官方demo

React 相关

  1. react-pwa -- 具有通用路由(服务器端渲染)与React&Redux的渐进式Web应用程序,内置SEO,实现最大页面速度

  2. storybook -- React,React-Native,Vue UI组件的交互式开发和测试环境

  3. react-konva -- 使用React绘制复杂画布图形的JavaScript库

  4. react-chartkick -- 用一行React创建漂亮的图表再也不用配各种插件啦!

    demos

  5. react-select -- 使用React JS构建的Select控件

    示例

  6. react-swipeable-views -- 可滑动视图的React组件。

    示例

  7. ReactPrimer -- React组件原型工具,生成关联的类组件代码。
    我觉得这是个神器,react党一定要下一个玩玩
    demo

  8. react-aux -- 一个用于渲染多个元素的自我消除组件

    react v16之前,从一个组件中返回多个元素以将它们包装在一个辅助元素中

    const Root = () => {
      return <div>
        <p>Hello, World!</p>
        <p>I am a demo for react-aux.</p>
      </div>;
    };

    产生如下的dom

    <div>
      <p>Hello, World!</p>
      <p>I am a demo for react-aux.</p>
    </div>

    使用react-aux

    const Aux = (props) => {
      return props.children;
    };
    
    const Root = () => {
      return <Aux>
        <p>Hello, World!</p>
        <p>I am a demo for react-aux.</p>
      </Aux>;
    };

    后者生成没有包装节点的段落元素:

    <p>Hello, World!</p>
    <p>I am a demo for react-aux.</p>

架构相关

  1. yapi -- YApi 是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台

    官网

  2. json-server -- 在30秒内得到一个完整的虚拟REST API

  3. Front-End-Checklist -- 现代网站和一丝不苟的开发人员的完美的前端清单
    用这个清单来检查你的项目吧~

  4. razzle -- 无需配置即可创建服务器渲染的通用JavaScript应用程序神器!不用解释!

  5. purgecss -- 删除未使用的CSS在gulp、webpack中都可配置!

Vue相关

  1. tiny-vue -- 缩小版的vue这是作者用来学习vue1.0.28源码,写出来的精简版,同时也包含他在创作过程中的博客。

Node相关

  1. bottender -- 用你自己的方式快速、灵活的创建机器人

  2. server -- 简单而强大的Node.js服务器

    【官网】

  3. remoteStorage.js -- 将用户数据本地存储在浏览器中,以及连接到远程存储服务器并跨设备和应用程序同步数据。

  4. emittery -- 简单和现代的异步事件发射器

博客

  1. FE-Interview -- 前端面试题大合集——小菜鸟前端面试大作战
  2. git-tips -- Git的奇技淫巧(中文)
  3. Functional-Light-JS -- 轻量函数式js编程

第三方api

  1. instagram-proxy-api -- CORS兼容的API来访问Instagram的公共数据

funny stuff

  1. client -- 最小的聊天客户端库

    【官网】

  2. js-code-to-svg-flowchart -- 一个将任何JavaScript代码转换成漂亮的SVG流程图的可视化库。学习其他的代码。设计你的代码。重构代码。文档代码。解释代码。

    demo

  3. chalktalk -- 使用类似黑板的界面,演示者可以创建动画数字草图并与其进行交互,以便在现场演示或对话中展示想法和概念。

    demo

  4. nba-go -- 最好的NBA CLI。这个究极酷,虽然看不了实况但可以随时追踪比分,很酷!!

    demo

  5. Sudachi -- 日常个人计划的时间表编辑器。 这个目前只支持macOS
    demo
    下载地址

  6. cs-playground-react -- 用JavaScript实现常用排序算法和数据结构的交互式概述这个超赞的,作者把原理和算法的代码都放到了项目中,点击演示地址进行操作

如何在react-native中实现饼图和环形图

前言。。和一些关于repo起名的建议

在github上找了很多图表类的插件,大多都是直方图之类的显示完好,到了饼图都差强人意。因为react-native版本更新的快,用不同的版本必须适配不同的第三方库,所以很多repo维护的都比较慢(或者类似于react-native-chart就直接不更新了),如果你非得用某个第三方库,在你当前版本不适合的情况下,要么换库,要么就降级react-native版本。这导致在开发上非常棘手,因为是团队项目,不可能去降级react-native版本的啊,在找适合的第三方库的过程中也是一度陷入了绝望之中。直到在react-native-chart的readme中发现了victory-native。这里,我不得不吐槽一下他的repo名,victory什么鬼啊,没用过你家react-victory的人真心不知道你是干啥的。

这啥子命名哦!摔!错误的命名示例

说句题外话,如果自己有repo的小伙伴一定要重视你的项目命名,最好把它的功能用命名的方式描述出来,然后详细写下description,这样才能提高star数,(来自一个刚刚参透这些道理并且写了不少repo,star数扔为0的老阿姨的忠告)。如果你经常从github上找三方库你就会发现,star数很高的项目基本上都是文档详尽,description写的很清楚的一些项目。拿react-native-chart举例,虽然也是个不错的repo,但已经不能满足当前的react-native版本了,比起victory-native还是有很多不足的地方,但是他的star数要比victory-native高一倍。起个名字还是关系着命运啊,就像王胜利王.我会做图表一样,你会找谁做图表呢。。

react-native-chart,想有star就该这样命名

先看效果图

demp

安装victory-native

首先,先要安装react-native-svg,对应你的react-native版本号进行安装。

react-native-svg >= 3.2.0 only supports react-native >= 0.29.0
react-native-svg >= 4.2.0 only supports react-native >= 0.32.0
react-native-svg >= 4.3.0 only supports react-native >= 0.33.0
react-native-svg >= 4.4.0 only supports react-native >= 0.38.0 and react >= 15.4.0
react-native-svg >= 4.5.0 only supports react-native >= 0.40.0 and react >= 15.4.0
react-native-svg >= 5.1.8 only supports react-native >= 0.44.0 and react == 16.0.0-alpha.6
react-native-svg >= 5.2.0 only supports react-native >= 0.45.0 and react == 16.0.0-alpha.12
react-native-svg >= 5.3.0 only supports react-native >= 0.46.0 and react == 16.0.0-alpha.12
react-native-svg >= 5.4.1 only supports react-native >= 0.47.0 and react == 16.0.0-alpha.12
react-native-svg >= 5.5.1 only supports react-native >= 0.50.0 and react == 16.0.0

之后link一下

react-native link react-native-svg

重新打包安装

react-native run-ios
// or
react-native run-android

然后安装victory-native

yarn add victory-native

使用

先引入,这里只讨论饼图,不过很多参数都是共同的,其他的见官方文档

import {
  VictoryPie,
  VictoryLegend,
} from 'victory-native';

使用组件

<VictoryPie
            padding={{ top: 0, left: 0 }}
            colorScale={colorScale}
            data={[
              { x: '净值', y: 35 },
              { x: '已用', y: 40 },
              { x: '可用', y: 55 },
              { x: '总盈亏', y: 55 },
            ]}
            innerRadius={px2dp(75)}
            height={256}
            width={256}
            labels={() => ''}
          />

参数

这里写的参数只是基础的几个,想要进行扩展去看下官方文档,写的非常详尽。

data

类似于json形式,x代表数据的类型,y是数据的值;也可以是纯数组的形式。

colorScale

这个参数指每个类型的颜色,是一组数组,顺序按照data中给出的顺序。如:

const colorScale = ['tomato', 'orange', 'gold', 'navy'];

innerRadius

指的是圆形中间的圆半径大小。如果设置为0就是一个纯饼图。

height,width

设置整个svg的大小,不设置默认为填充父组件。

labels

标签名,将data进行处理后渲染到图中。因为需求中不显示标签名,所以设置为()=>{}

<VictoryPie
  data={sampleData}
  labels={(d) => `y: ${d.y}`}
/>

padding

内边距大小。这个属性默认并不为0,所以会在分辨率不同的设备上显示不一,建议设置为0,然后在整个组件外部包个View进行显示。

图例

<VictoryLegend
              padding={{ top: 0, left: 0 }}
              title=""
              orientation="vertical"
              style={{ labels: { fontSize: sizes.f2 } }}
              gutter={px2dp(25)}
              data={[
                {
                  name: '净值',
                  symbol: { fill: 'tomato', type: 'square' },
                },
                {
                  name: '已用',
                  symbol: { fill: 'orange', type: 'square' },
                },
                {
                  name: '可用',
                  symbol: { fill: 'gold', type: 'square' },
                },
                { name: '总盈亏', symbol: { fill: 'navy', type: 'square' } },
              ]}
              width={px2dp(150)}
            />

参数

title

整个图例的名字。如title='图例'

data

类似于json的数据结构,包含图例名(name),和图例样式(type)以及图例颜色(fill)。

gutter

指的是每条图例之间的间距。

orientation

图例的排列方式。横排或纵排。

参考资料

  1. react-native-svg repo 地址
  2. victory-native repo 地址
  3. victory官方文档

2018年1月github上值得关注的开源项目

框架

  1. hyperapp -- 1 KB用于构建Web应用程序的JavaScript库。他的特点是轻量和开箱即用,它将状态管理与支持密钥更新和生命周期事件的VDOM引擎相结合,所有这些都不依赖于任何依赖关系。

架构相关

  1. jarvis -- 一个非常智能的基于浏览器的Webpack仪表板它的主要特点是可以查看在12种不同的网络制式中你的项目的表现情况。
    demo

网络通信

1.greenlet -- 移动一个异步函数到自己的线程。他的原理是接受一个异步函数,生成一个在Web Worker中运行的副本。

示例:

import greenlet from 'greenlet'

let get = greenlet(async url => {
	let res = await fetch(url)
	return await res.json()
})

console.log(await get('/foo'))
  1. sockette -- 最可爱的小WebSocket包装!Sockette是一个很小的(319字节)WebSocket封装,如果连接丢失,它将自动重新连接!

编辑器

  1. tui.editor -- Markdown所见即所得的编辑器。图表和UML在markdown语法。
    demo

react相关

  1. react-sortable-hoc -- 触摸有好、可排序的列表
  2. after.js -- 类似Next.js,使用React Router 4构建的ssr React应用程序的框架

node相关

  1. polka -- 基于express的微型Web服务器简单程序上比express快30%;支持中间件:包括express中间件;和express几乎相同的api和路由模式;
  2. safe-start-koa2 -- 简單直接的 Koa2 的脚手架

PWA

  1. lavas -- 基于 Vue 的 PWA 解决方案,帮助开发者快速搭建 PWA 应用,解决接入 PWA 的各种问题

官网示例,建议在手机浏览器打开

博客/文档

  1. project-guidelines -- JavaScript工程项目的一系列最佳实践策略

  2. outline -- 为成长中的团队开放源代码wiki和知识库比较适合创业团队来看的

    文档

  3. standard -- JavaScript风格指南,配有linter&自动代码修复器

  4. webpack-demos -- Webpack的简单演示的集合

funny-stuff

  1. PlanMaster -- 威信小程序套餐助手:手机套餐对比选购小程序
  2. jspaint -- windows经典的画图工具

demo

demo地址
3. ilsap -- Intellij许可证服务器活动代理这个我自己还没有测试,使用jet brains家的产品就fork一下把~~

使用jest测试rn组件

准备阶段

  1. 需要一个rn项目,这里演示的是我个人的项目ReactNative-ReduxSaga-TODO
  2. 安装jest
    如果你是用react-native init命令行创建的rn项目,并且你的rn版本在0.38以上,则无需安装了。不太清楚的话就看一下package.json文件中是否包含以下代码:
    // package.json
  "scripts": {
    "test": "jest"
  },
  "jest": {
    "preset": "react-native"
  }

如果没有就安装一下npm i jest --save-dev,并把上述代码添加到package.json文件的对应位置。
3. 以上步骤完成后,简单运行npm run test测试一下jest是否配置成功。但我们没有写测试用例,终端会打印no tests found。这时就配置完成了。

快照测试

写一个组件

import React from 'react';
import {
  Text, View,
} from 'react-native';

import PropTypes from 'prop-types';

const PostArea = ({ title, text, color }) => (
  <View style={{ backgroundColor: '#ddd', height: 100 }}>
    <Text style={{ fontSize: 30 }}>{title}</Text>
    <Text style={{ fontSize: 15, color }}>{text}</Text>
  </View>
);

export default PostArea;

在项目根目录下找到__test__文件夹,现在,让我们使用React的测试渲染器和Jest的快照功能来与组件进行交互,并捕获呈现的输出并创建一个快照文件。

// PostArea_test.js
import 'react-native';
import React from 'react';
import PostArea from '../js/Twitter/PostArea';

import renderer from 'react-test-renderer';

test('renders correctly', () => {
  const tree = renderer.create(<PostArea title="title" text="text" color="red" />).toJSON();
  expect(tree).toMatchSnapshot();
});

然后在终端运行npm run testjest。将会输出:

PASS  __tests__\PostArea_test.js (6.657s)
  √ renders correctly (5553ms)

 › 1 snapshot written.
Snapshot Summary
 › 1 snapshot written in 1 test suite.

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   1 added, 1 total
Time:        8.198s
Ran all test suites.

同时,在__test__文件夹下会输出一个文件,即为生成的快照。

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`renders correctly 1`] = `
<View
  style={
    Object {
      "backgroundColor": "#ddd",
      "height": 100,
    }
  }
>
  <Text
    accessible={true}
    allowFontScaling={true}
    disabled={false}
    ellipsizeMode="tail"
    style={
      Object {
        "fontSize": 30,
      }
    }
  >
    title
  </Text>
  <Text
    accessible={true}
    allowFontScaling={true}
    disabled={false}
    ellipsizeMode="tail"
    style={
      Object {
        "color": "red",
        "fontSize": 15,
      }
    }
  >
    text
  </Text>
</View>
`;

修改源文件

在下一次运行测试的时候,呈现的输出将与之前创建的快照进行比较。快照应该和代码一起提交。当快照测试失败的时候,就需要检查是否有意或无意的更改。如果是和预期中的变化一样,调用jest -u来覆盖当前的快照。

我们来更改一下原来的代码:把第二行<Text>的字号改为14.

<Text style={{ fontSize: 14, color }}>{text}</Text>

这时,我们再运行jest。这时终端将会抛出错误,并指出了错误位置
img

因为这段代码是我们有意改的,这时运行jest -u,快照被覆盖。再执行jest则不会报错了~

es6 co的使用与实现

虽然现在异步解决方案都用async/await了,但co是一个小巧而精致的库,我们也可以学习一下他的实现原理。

什么是co

co是一个函数库,用于generator的自动执行。

我们先定义一个generator,用来异步读下面几个文件

const gen=function *(){

    const b=yield read('b.js')
    console.log(b.length)

    const c=yield read('c.js')
    console.log(c.length)
}

其中,我们定义的read异步读取文件的函数为:

function read(file){
    fs.readFile(file,'utf8',(err,res)=>{
        g.next(res)
    })
}

const g=gen()
g.next() //将分别输出两个文件的长度

co的使用

虽然上面的代码也可以顺利异步执行generator函数,但是需要把next()写到异步函数中,
增加了耦合度,而且还要创建generator的实例,代码很繁琐。

我们使用co重构上面的代码:

首先要改造一下异步函数的结构,co规定所有的异步函数必须是偏函数,称之为thunk函数:

function read(file){
    return (fn)=>{
        fs.readFile(file,'utf8',fn)
    }
}

之后,只要把generator传到co中就大功告成了

const co=require('co')

co(gen)() //分别输出两个文件的长度

实现一个简单的co

function co(fn) {
    return function(done) {
        const ctx = this;
        const gen = fn.call(ctx);
        let it = null;
        function _next(err, res) {
            if(err) res = err;
            it = gen.next(res);
            //{value:function(){},done:false}
            if(!it.done){
                it.value(_next);
            }
        }
        _next();
    }
}

这部分的核心代码为:

function _next(err, res) {
    if(err) res = err;
    it = gen.next(res);
    //{value:function(){},done:false}
    if(!it.done){
        it.value(_next);
    }
}

_next();

他的目的是递归调用generator的next(),直到done为true时,停止递归。

在调用第一次next()的之后,it为:

it={
    value:(fn)=>{fs.readFile(file,'utf8',fn)},
    done:false
}

it.donefalse的情况下,将_next()这个函数作为实参传到(fn)=>{fs.readFile(file,'utf8',fn)}中。
这时才正式执行读取文件的操作,res为读取的文件内容,之后再次执行_next()

第二次调用_next()后,将res值塞回gen中,之后执行:

 const b=res
 console.log(b.length)

之后往后执行,遇到yield又中断了,再次读取c.js中的内容,之后又进入_next(),再把res值塞回gen中,和上次一样执行下列代码:

 const c=res
 console.log(c.length)

之后再触发_next()知道done状态为true

全部代码

这里的执行顺序比较乱,强烈建议大家去加断点多跑几遍!

function co(fn) {
    return function(done) {
        const ctx = this;
        const gen = fn.call(ctx);
        let it = null;
        function _next(err, res) {
            if(err) res = err;
            it = gen.next(res);
            //{value:function(){},done:false}
            if(!it.done){
                it.value(_next);
            }
        }
        _next();
    }
}

function read(file){
    return (fn)=>{
        fs.readFile(file,'utf8',fn)
    }
}

const gen=function *(){
    const b=yield read('error.js')
    console.log(b.length)

    const c=yield read('package.json')
    console.log(c.length)
}

co(gen)()

相关链接

  1. co 函数库的含义和用法
  2. Generator 函数的含义与用法

git commit自动化与规范化

前言

之前我写过一篇有关于git提交的文档《用gitmoji来提交你的git commit吧》,然而在实际上应用并不是很方便,大多情况得翻阅gitmoji对照表来写commit,且并不规范,仅仅适用于自己开发的项目,放到团队上commit可读性不高。最近翻阅了一篇文章《你可能会忽略的 Git 提交规范》,才知道自己之前写的commit非常随意,在项目初期,写的还蛮正规的:

demo

然而之后懒了,前面的tag也没加。(所以说,好的习惯要坚持,只要有一次没做,后面就容易堕怠)

demo

去审查一下你自己的commit~如果你不习惯使用git GUI,在bash中运行以下命令:

$ git log [tag name/branch name] HEAD --pretty=format:%s

commit规则格式

建议的格式如下:

<type>(<scope>): <subject>

type

用于声明此次commit的主要目的类别:

feat:feature、发布新功能
fix:修复bug
docs:更新文档
style: 代码格式
refactor:代码重构
test:增加测试
chore:构建过程或辅助工具的变动

scope

用于说明commit影响的范围;如数据层(model),视图层(view),控制层(controller)等。

subject

commit的主题描述,少于50个字。

其实在《Commit message 和 Change log 编写指南》这篇文章中都有很详细的描述,文中也提到了commit message有body和footer,用于详细描述和关闭issue的补充。不过个人觉得在subject中写这些内容已经足够了。

了解git hooks

提到“hooks”这个词我们应该并不陌生,比如vuereact都有自己的lifecycle hooks,在git中分为客户端hooks服务端hooks。在commit阶段中涉及到的是客户端hooks,其中客户端hooks包含:

pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交,不过你可以用 git commit --no-verify 来绕过这个环节。 你可以利用该钩子,来检查代码风格是否一致(运行类似 lint 的程序)、尾随空白字符是否存在(自带的钩子就是这么做的),或新方法的文档是否适当。

prepare-commit-msg 钩子在启动提交信息编辑器之前,默认信息被创建之后运行。 它允许你编辑提交者所看到的默认信息。 该钩子接收一些选项:存有当前提交信息的文件的路径、提交类型和修补提交的提交的 SHA-1 校验。 它对一般的提交来说并没有什么用;然而对那些会自动产生默认信息的提交,如提交信息模板、合并提交、压缩提交和修订提交等非常实用。 你可以结合提交模板来使用它,动态地插入信息。

commit-msg 钩子接收一个参数,此参数即上文提到的,存有当前提交信息的临时文件的路径。 如果该钩子脚本以非零值退出,Git 将放弃提交,因此,可以用来在提交通过前验证项目状态或提交信息。

post-commit 钩子在整个提交过程完成后运行。 它不接收任何参数,但你可以很容易地通过运行 git log -1 HEAD 来获得最后一次的提交信息。 该钩子一般用于通知之类的事情。

这里我们主要是在pre-commit阶段来检查commit是否符合规范。

提交前的配置

自动格式化代码

在提交代码前需要格式代码,这里用git hooks:pre-commit

lint-staged

针对暂存的git文件运行linters并且不要让垃圾代码滑入你的代码库!lint-staged的最新版本需要Node.js v6或更新版本。(在v7之前的lint-staged版本仍可与Node.js v4一起使用。)

husky

在git hooks每个阶段执行脚本来避免垃圾代码的提交和push。
安装lint-stagedhusky

yarn add lint-staged husky

package.json写入:

  "scripts": {
    ...
    "precommit":"lint-staged"
  },
  "lint-staged": {
    "*.js": ["eslint --fix","git add"]
  },

这时当你执行git commit操作时,一旦在暂存区存在eslint格式错误的代码,将会自动修复并加入缓存区(eslint --fix 无法自动修复的将会报错)。

如图:

无法自动修复,commit失败

规范化commit-msg

这里我们使用另一个git hooks:commitmsg,我们来安装validate-commit-msg检查 Commit message 是否符合格式。

yarn add validate-commit-msg

package.json中配置:

"scripts": {
    ...
    "commitmsg": "validate-commit-msg"
  },

如果要进行自定义配置,我们可以自建一个文件.vcmrc:

{
  "types": ["feat", "fix", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore", "revert",":art"],
  "scope": {
    "required": false,
    "allowed": ["*"],
    "validate": false,
    "multiple": false
  },
  "warnOnFail": false,
  "maxSubjectLength": 100,
  "helpMessage": "",
  "autoFix": false
}

随便写一个commit,会提示不符合规范。

demo

让我们来写一个示例~

git commit -m "style: eslint"

测试一下,成功提交~~关于commit-msg这部分可以参考vue的commit.

demo

生成changelog

写好commit也可以自动生成每个版本的更改,可以参考vue的changelog

demo

配置步骤

安装standard-version

yarn add standard-version

package.json中配置:

"scripts": {
    ...
    "release": "standard-version"
  },

在发布新版本的时候,运行以下命令:

yarn release

如果按照commitizen规范书写你的commit-msg,即可在你项目中自动生成changelog,如图:

demo

参考文档

  1. 你可能会忽略的 Git 提交规范
  2. Commit message 和 Change log 编写指南
  3. 使用 ESlint、lint-staged 半自动提升项目代码质量
  4. 8.3 自定义 Git - Git 钩子

<2018 react conf>-90%清理你的react组件

2018 react conf在今年十月底于las vegas举行,其中主讲人Ryan Florence,演示了使用最新版本的react其中的几个hooks api可以大幅减少react functional 组件的代码量,本篇文章将围绕这个内容进行补充和示范。(在文章的结尾有大会的油管连接,没有梯子的小伙伴可以在b站上自行搜索)。

比如现在有个需求,需要监听键盘输入内容,显示在屏幕的某块可见范围中,效果如下:

demo

以下代码基于create-react-app创建。

使用稳定版本react实现(v15)

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      words: ''
    }
    this.keyFunc = this.keyFunc.bind(this)
  }

  componentDidMount() {
    window.addEventListener('keypress', this.keyFunc)
  }

  componentWillUnmount() {
    window.removeEventListener('keypress', this.keyFunc)
  }

  keyFunc(e) {
    this.setState(prev => ({
      words: prev.words + e.key
    }))
  }

  render() {
    const { words } = this.state
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>{words}</p>
        </header>
      </div>
    );
  }
}

我们会发现仅仅为了绑定监听函数和使用state,就要调用两个钩子函数和声明为类组件,是不是有点小题大做了??那么我们看一下v16的react给我们带来的简洁高效!

使用alpha版本(v16.7)

首先安装

yarn add react@next,react-dom@next
import React, { useState, useEffect } from 'react';

function setIt(initWords) {
  const [words, setWords] = useState(initWords);
  const listener = (e) => { setWords(prev => (prev + e.key)) }
  useEffect(() => {
    window.addEventListener('keypress', listener);
    console.log('aaa')
    return () => window.removeEventListener('keypress', listener);
  }, [])
  return words
}

function App() {
  const words = setIt('')
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>{words}</p>
      </header>
    </div>
  );
}

看啊!虽然是functional component,却可以产生和class组件一样的效果,而且减少了代码量。那么useStateuseEffect到底是干啥的呢?往下翻OVO

api

useState

类似于setState,但不支持state object扩展,如下

setState(prevState => {
  // Object.assign would also work
  return {...prevState, ...updatedValues};
});

useState用法如下:

const [state, setState] = useState(initialState);

延迟初始化

如果initState是需要昂贵计算的结果,它也可以被延时提供,如下。

const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
});

useEffect

useEffect(didUpdate);

使用useEffect,传递给它的函数将会在组件渲染到屏幕后运行。

在从屏幕上卸载组件之前,要清除监听器或者定时器以避免内存泄漏。useEffect可以返回一个清除函数,来完成这项操作,如:

useEffect(() => {
  const subscription = props.source.subscribe();
  return () => {
    // Clean up the subscription
    subscription.unsubscribe();
  };
});

触发effect的时机

在组件每次渲染完毕之后触发effect,在此期间如果有输入变化,总是会重新建立effect。这里就引出了useEffect的第二个参数,他是一个数组类型,指的是产生effect所依赖的值。

比如我们将上述代码改为

useEffect(() => {
    window.addEventListener('keypress', listener);
    console.log('aaa')
    return () => window.removeEventListener('keypress', listener);
  }, [state.words])

指该effect依赖于state.effect这个字段,如果它变化的话,将会触发effect函数,在此例中只要输入,就会触发effect中的函数(如果你尝试此例的话,当你的键盘在输入时,会看到控制台在打印aaa)。那么,如果我们传入空数组,useEffect只会在componentDidMountcomponentWillUnmount阶段触发,也就是仅仅触发一次(这时控制台只打印了一次aaa)。

参考链接

  1. react-conf-2018
  2. youtube视频 -- 90% Cleaner React - Ryan Florence - React Conf 2018
  3. react api-【userState】
  4. react conf 2018主站

举个栗子详解事件代理

为啥要使用事件代理

我们在开发中,可能会遇见这样的需求:

在一个列表中点击每个列表项,将每个列表项中的内容传入某个函数中进行处理。

通常结构为

    <ul id="list">
        <li>msg</li>
        <li>msg1</li>
        <li>msg2</li>
        <li>msg3</li>
    </ul>

这里需要点击某个列表项,弹出他的内容文本,不难写出下面的方法:

window.onload = () => {
            const ulNode = document.getElementById("list")
            const liNodes = ulNode.childNode || ulNode.children
            for (let i = 0; i < liNodes.length; i++) {
                liNodes[i].addEventListener('click', (e) => {
                        alert(e.target.innerHTML)
                    }, {
                        once: true
                    }) // once:在调用一次后被移除
            }
        }

效果如图

然而,当我们对这个大列表进行dom操作时,比如添加一个节点,但上面的事件并没有绑定到这个新节点上,需要我们再次调用这个函数,重新遍历这些子节点,绑定事件。
如图

了解事件捕获和冒泡

事件捕获:当某个元素触发某个事件(如onclick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。在这个过程中,事件相应的监听函数是不会被触发的。

事件目标:当到达目标元素之后,执行目标元素该事件相应的处理函数。如果没有绑定监听函数,那就不执行。

事件冒泡:从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被一次触发。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)来组织事件的冒泡传播。
img

使用事件代理

当子节点被点击时,click事件向上冒泡,父节点捕获到事件后,我们判断是否为所需的节点,然后进行处理。代码如下:

       const ulNode = document.getElementById("list")
       ulNode.addEventListener('click',(e)=>{
            // e.target为当前元素的子节点,这里只对li元素进行处理
            if(e.target&&e.target.nodeName.toLowerCase()==='li'){
                alert(e.target.innerHTML)
            }
       })

        const btn = document.getElementById('btn')
        btn.onclick = () => {
            const newLi=document.createElement('li')
            const text=document.createTextNode("new msg")
            newLi.appendChild(text)
            ulNode.appendChild(newLi)
        }

效果如图

不需要再次为新节点绑定事件,照样会响应。

当我们把新建的子节点改成p元素时,

 const newLi=document.createElement('p')

如图

因为做了判断,所以点击p元素是没有响应的。

2017年10月github上值得关注的开源项目

UI相关

  1. weex-ui - weex的ui库
  2. iview-admin - 基于iview的后台继承解决方案

   【详细介绍】
3. material-ui -- google material design的react component的解决方案
4. ant-design-pro -- 开箱即用的中台前端/设计解决方案。
官网

文件处理

  1. url-to-pdf-api -- 把网页转成pdf

代码分析工具

  1. livepython -- 可视化的跟踪python代码
    demo
  2. webpackmonitor -- 通过开发过程监控Webpack优化指标的工具
  3. React-Sight -- 用于React的可视化工具,支持Fiber,Router(v4)和Redux

文本编辑器

  1. slate -- 一个完全可定制的框架来构建丰富的文本编辑器。
    【Demo】
  2. ckeditor5 -- 最好的基于浏览器的富文本编辑器
    【官网】

图像处理

  1. image-trace-loader -- 加载图像并将跟踪的轮廓作为image / svg + xml URL编码数据

  2. spirit -- 网络的动画工具

    【官网】

  3. svgr -- 将SVG转换为React组件

数据图表相关

  1. maptalks.js -- 一个轻的JavaScript库来创建集成的2D / 3D地图。

    【官网】

  2. st.js -- 选择变换JSON中的JSON模板

    【官网】

  3. yap-csv -- Node.js包管理CSV到JSON转换,支持复杂的字段映射

开发时会用到的

  1. prettier -- 一个固执的代码整理工具

  2. deco-ide -- 一个React-Native IDE

    Demo

  3. webpack-dashboard -- 用于webpack dev服务器的CLI仪表板

    Demo

框架相关

  1. vuera -- vue和react的无缝集成

  2. react-email-editor -- 可以拖拽的react Email编辑器组件

  3. classwrap -- 0.3 KB JavaScript实用程序用于有条件地连接类名。

  4. create-component-app -- 从终端生成不同类型的React组件的工具

    demo

  5. react-native-simple-radio-button -- React Native简单和方便的动画单选按钮组件

    demo

node相关

  1. iconv-lite -- 用纯javaScript转换字符编码

  2. puppeteer -- 一个node库,提供了一组用来操纵Chrome的API

    蚂蚁金服对puppeteer的一些介绍

    【DEMO】

  3. flyio -- 支持请求重定向的轻量级、跨平台Javascript http网络库

    【官网】

网络测试相关

  1. speed-test -- 使用cli测试您的互联网连接速度和ping速度

博客

  1. core-js -- js标准库
  2. 从零开始构建 JavaScript 技术栈 - 中文版
  3. awesome-react-native - React Native 学习资源精选仓库(汇聚知识,分享精华)汇集了各类react-native学习资料、工具、组件、开源App、资源下载、以及相关新闻等,只求精不求全
  4. engineer-manager -- 工程管理人员资源链接列表

funny-stuff

  1. Rocket.Chat -- 使用Meteor搭建的像Slack一样的在线聊天工具

  2. lottery.js -- 一个简单的抽奖应用程序

    【DEMO】

  3. React-2048-game -- 基于 react, redux 最佳实践构建的 2048

  4. ieaseMusic - 优雅的网易音乐桌面应用,Rock与NeteaseMusic

  5. mini-tetris -- 512b的俄罗斯方块

    【Demo】

  6. writing -- 一个轻量级的无干扰文本编辑器(Markdown and LaTeX supported)
    demo

  7. BOOLR -- 数字逻辑模拟器

    【官网】

  8. wedding -- 婚礼大屏互动,微信请柬一站式解决方案这个简直太浪漫太好玩了~~不知道到我结婚时node是不是都到20.0了啊哈哈
    demo

  9. JSRobot -- 通过JavaScript编码播放的平台游戏

    游戏链接

  10. NeteaseCloudMusic -- React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台。
    demo

  11. lyadmin -- 一套轻量级通用后台,采用ThinkPHP+Bootstrap3制作,内置系统设置、上传管理、权限管理、模块管理、插件管理等功能,独有的Builder页面自动生成技术节省50%开发成本,先进的模块化开发的支持让开发成本一降再降,致力于为个人和中小型企业打造全方位的PHP企业级开发解决方案。另外提供整套企业开发解决方案,集PC、手机、微信、App、小程序五端于一体,更有用户中心模块、门户模块、钱包支付中心模块、商城模块、OAuth2统一登陆、内部Git模块、Docker模块可供选择。

    【官网】

  12. strapi -- Node.js内容管理框架(无头CMS),无需任何努力即可构建强大的API。

  13. instagib.io -- 在线多人射击游戏这个还挺有意思的

    官网

  14. cyborg-writer -- 具有嵌入式神经文本合成器的实验文本编辑器
    demo

    官网

  15. heml -- HEML是用于构建响应式电子邮件的开源标记语言。

    【Demo】

2018年2月github上值得关注的开源项目

框架

  1. ice -- (邀请公测)赋能企业中后台建设 - 海量可复用物料,通过 GUI 工具极速构建中后台应用

    官网

  2. viron -- 基于自动化设计的管理控制台你所做的只是创建一个API服务器和一个OAS2.0 json文件。然后viron管理工具已准备好使用。你不需要编写前端代码!

    demo

    官网

网络聊天室

  1. lounge -- 现代自主网络IRC客户端具有推送通知、链接预览、信息标记;始终连接;跨平台;响应式;优秀的同步体验。

RN相关

  1. react-native-sideswipe简单的走马灯???

    demo

react相关

  1. mdxc -- 在jsx中写markdown

    官网示例

图表相关

  1. just-dashboard -- 使用YAML / JSON文件创建仪表板

    demo

数据库相关

  1. node-mongodb-native -- Mongo DB本机NodeJS驱动程序

博客/文档

  1. awesome-cheatsheets -- 流行的编程语言和框架的备忘录。你应该知道什么组织在一个单一的文件
    看了下,是作者个人记录的各种命令行和某些框架的配置命令,命令行还比较实用,配置啥的其实看官方文档可以查到,作者也不会一直追踪最新版的框架。

2.first-contributions -- 一个让初学者贡献开源的项目可以说是一个详细的贡献开源的教程
3.front-end-interview-handbook -- 几乎完整的答案,您可以用来面试潜在的候选人,测试自己或完全忽略“前端工作面试问题”

游戏相关

  1. phaser -- Phaser是一个有趣,免费且快速的2D游戏框架,用于制作适用于桌面和移动Web浏览器的HTML5游戏,支持Canvas和WebGL渲染。一个非常著名的游戏框架,官网文档超级全

    官网

funny stuff

  1. carbon -- 创建和分享源代码的美丽图像就是将自己的代码,生成图像,拥有很多高亮,还挺有意思的。

    demo

  2. tetris -- 流行的游戏俄罗斯方块的克隆。其实就是个小游戏,感兴趣的可以看看源代码

    游戏地址

  3. OpenSC2K -- 由Maxis公司开发的SimCity 2000开源软件使用HTML5 Canvas API和SQLite编写的使用JavaScript编写的模拟城市 2000的开放源代码重建,并且构建在Electron上。

  4. baidu-pet-chain-buyer -- 百度莱茨狗抢购插件
    Chrome商店地址:

  5. kap -- 使用网络技术构建的开源屏幕录像机

  6. oji -- 文本表情符号生成器

    demo

  7. rekit -- 使用React,Redux和React-router构建可伸缩Web应用程序的工具包可以说是react的ide了

    demo

taro初探:使用taro构建微信小程序基础教程

前言

由于微信小程序在开发上不能安装npm依赖,和开发流程上也饱受诟病;Taro 是由京东·凹凸实验室(aotu.io)倾力打造的 多端开发解决方案,在本篇文章中主要介绍了使用taro搭建微信小程序的一些步骤和一个简单demo的实现。

安装

先全局安装@tarojs/cli

$ npm install -g @tarojs/cli
$ yarn global add @tarojs/cli

之后我们初始化一个名为myApp的项目:

$ taro init myApp

然后输入你的配置:
demo

之后等待所有依赖安装完毕。

开发

在命令行执行

$ npm run dev:weapp

taro将会进入微信小程序编译预览模式。我们打开微信开发者工具,将项目导入,会在预览窗口中看到hello world。这时我们就可以进行开发啦~~

1.生命周期函数

生命周期方法 作用 说明
componentWillMount 程序被载入 对应微信小程序onLaunch
componentDidMount 程序被载入 对应微信小程序onLaunch,在componentWillMount之后执行
componentDidShow 程序展示出来 对应微信小程序onShow
componentDidHide 程序被隐藏 对应微信小程序onHide

不过当然也包含componentWillUnmout componentWillReceiveProps 等react原始生命周期函数,用来编写自定义组件。

2.路由

在 Taro 中,路由功能是默认自带的,不需要开发者进行额外的路由配置。

// 跳转到目的页面,打开新页面
Taro.navigateTo({
  url: '/pages/page/path/name'
})

// 跳转到目的页面,在当前页面打开
Taro.redirectTo({
  url: '/pages/page/path/name'
})

传参

// 传入参数 id=2&type=test
Taro.navigateTo({
  url: '/pages/page/path/name?id=2&type=test'
})

我们可以使用this.$router.params来获取路由上的参数。

3.组件

Taro 以 微信小程序组件库 为标准,结合 jsx 语法规范,定制了一套自己的组件库规范。这部分可以自行去看文档。值得注意的是,小程序中的写法bind*这种事件都要改成以on开头。

写个demo

现在使用taro构建一个很简单的demo;需要实现简单的组件调用,路由跳转传参等功能。

demo

1.主页

一个Swiper,一个列表组件:

// index.js
import Taro, { Component } from '@tarojs/taro'
import { View, Swiper,SwiperItem, Image } from '@tarojs/components'
import ListItem from '../../components/ListItem'
import './index.less'
import img0 from './img/img0.jpg'
import img1 from './img/img1.jpg'
import img2 from './img/img2.jpg'

export default class Index extends Component {
  config = {
    navigationBarTitleText: '首页'
  }

  skipToDetail(){
    /*  */
  }

  render() {
    return (
      <View className='index'>
        <Swiper indicatorDots autoplay>
        {[img0,img1,img2].map(img=>(<SwiperItem key={img}><Image src={img} /></SwiperItem>))}
        </Swiper>
      {listSet.map(item=>(<ListItem onClick={this.skipToDetail.bind(this)} description={item.description} title={item.title} key={item.title} />))}
      </View>
    )
  }
}

const listSet=[
  {title:'标题一',description:'描述一'},
  {title:'标题二',description:'描述二'},
  {title:'标题三',description:'描述三'},
]

列表组件,注意这里有个坑,就是不能直接调用函数props,会报一个警告,说是没有找到onClick handler。查阅官方文档后,在issues 215中找到了答案,官方说是会在以后的版本中修复这个bug,目前先按下面代码写。

import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'
import './index.less'

export default class ListItem extends Component {
    skipToDetail(){
        /* 必须得这样写=。= */
        this.props.onClick()
      }
    render() {
        const { title, description } = this.props
        return (
            <View className='list-item' onClick={this.skipToDetail}>
                <View><Text>{title}</Text></View>
                <View><Text>{description}</Text></View>
            </View>
        )
    }
}

2.详情页跳转

我们在入口文件添加新的路由,指向详情页detail:
这里需要注意先配置好pages,然后再写这个组件,要不再编译的时候会找不到这个页

// app.js
 config = {
    pages: [
      'pages/index/index',
      'pages/detail/index'
    ],
    ...
  }

创建详情页:

import Taro, { Component } from '@tarojs/taro'
import { View } from '@tarojs/components'
import './index.less'

export default class Index extends Component {
  componentWillMount () {
  }
  config = {
    navigationBarTitleText: '详情页'
  }

  render () {
    const {title,description}=this.$router.params
    return (
      <View>
        ...
      </View>
    )
  }
}

要求点击每个列表项,需要进行跳转,并把当前的title和description传到详情页。需要在首页中的skipToDetail中补充以下内容:

skipToDetail({title,description}){
    Taro.navigateTo({
      url: `/pages/detail/index?title=${title}&description=${description}`
    })
  }

并在render方法中将参数传入这个函数中:

 render() {
    return (
      <View className='index'>
        ...
      {listSet.map(item=>(<ListItem onClick={this.skipToDetail.bind(this,item)} description={item.description} title={item.title} key={item.title} />))}
      </View>
    )
  }

参考文档

  1. taro官网文档

用gitmoji来提交你的git commit吧

我在逛github时,经常会看到像下面这样的提交记录,是不是很可爱(也很cool~~)
amazing commit
使用gitmoji来编写commit,使每次的commit能够更加直观,维护起来也更加方便:

我总结了一下经常会用到的gitmoji,以及他用来代表的提交类型,如下表所示:

表情 代码 代表内容
🎨 :art: 优化代码结构或格式
:zap: 提升性能
🔥 :fire: 移除代码或文件
🔧 :wrench: 修改配置文件
🐛 :bug: 修复bug
🚑 :ambulance: 修复关键程序
:sparkles: 介绍新功能
📝 :memo: 写文档
🚀 :rocket: 部署项目
💄 :lipstick: 更新UI和样式文件
🎉 :tada: 初始提交
:white_check_mark: 添加测试
🔒 :lock: 解决安全问题
🍎 :apple: 修复macOS上的东西
🐧 :penguin: 在Linux上修复一些东西
🏁 :checkered_flag: 修复Windows上的东西
🤖 :robot: 解决Android上的东西
🍏 :green_apple: 解决iOS上的东西
🔖 :bookmark: 发布/版本标签
🚨 :rotating_light: 删除linter警告
🚧 :construction: 未完工程
💚 :green_heart: 修复CI构建
⬇️ :arrow_down: 降级依赖
⬆️ :arrow_up: 升级依赖
👷 :construction_worker: 添加CI构建系统
📈 :chart_with_upwards_trend: 添加分析或跟踪代码
🔨 :hammer: 重构代码
:heavy_plus_sign: 添加依赖
:heavy_minus_sign: 删除依赖
✏️ :pencil2: 修正错别字
💩 :hankey: 编写需要改进的不好的代码
:rewind: 恢复更改
🔀 :twisted_rightwards_arrows: 合并分支
📦 :package: 更新编译的文件或包
👽 :alien: 由于外部API更改而更新代码
🚚 :truck: 移动或重命名文件
📄 :page_facing_up: 添加或更新许可证
💥 :boom: 介绍突破性变化
🍱 :bento: 添加或更新静态资源
👌 :ok_hand: 由于代码审阅更改而更新代码
:wheelchair: 改善无障碍
💡 :bulb: 记录源代码
💬 :speech_balloon: 更新文本或字面量
🗃️ :card_file_box: 执行与数据库相关的更改
🔊 :loud_sound: 添加日志
🔇 :mute: 删除日志
👥 :busts_in_silhouette: 添加贡献者
🚸 :children_crossing: 改善用户体验/可用性

防运营商劫持的基本操作

不知道大家有没有这样的体验,当你专心浏览网站内容的时候,会从右下角弹出小广告,当你点击关闭的时候,又会跳转到另外的链接,你以为是网站搞的鬼,但你尝试去联系管理员时,人家表示不背这个锅。其实这背后是你的网络运营商在借刀杀人~

市面上常见的运营商劫持主要是http劫持,https劫持和dns劫持。我们经常看到的右下角弹小广告的一般是http劫持,如果将http转为https可以减少被运营商劫持的机率,但也可能会被伪造证书,仍然会被劫持。所以我们需要在自己的程序中设置一个监听器来监控dom中劫持插入的脚本。

思路

需要在运营商插入非法代码之前监听dom变动,以下的例子只检查<script>标签。

step1.挂载dom监听器

主要使用html5的一个特性MutationObserver来观察dom变动,注意兼容性,如果你不打算兼容ie浏览器,MutationObserver是最好的选择。

MutationObserver兼容性图示

const observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
const isSupportObserver = !!observer
if (isSupportObserver) {
    console.info('The preventor is running...')
    new observer((records) => {
        // ....这里处理dom变动
    }).observe(watchNode, { childList: true, attributes: true })
} else {
    console.error('Your platform is not supported with "window.MutationObserver",please update.')
}

step2.处理dom变动,进行白名单筛选

经过上面的步骤,我们得到了网页中所有的<script>,之后筛选得到运营商注入的脚本信息,进行下一步操作。(你可以设置白名单,根据白名单进行过滤,设置白名单的过程这里不具体展开了,详见文章后面的完整代码。)

records.forEach(record => {
    const addedNodes = Array.from(record.addedNodes)
    addedNodes.forEach((node) => {
    if (node.tagName && ~filterTagList.indexOf(node.tagName.toLowerCase())) {
        const isInWhiteList = whiteRegList.some((reg) => reg.test(node.src))
        if (!isInWhiteList) {
            badInjections.push({ badNode: node, badSource: node.src })
        }
        }
    })
})

step3.处理运营商非法注入

我们在上一步得到的运营商注入的非法脚本,需要进行拦截和处理,最后发给运营商或举报到工信部。(注意这里,在head头部同步插入的脚本无法被监听到)。

badInjections.forEach(({ badNode, badSource }) => {
            badNode.remove(); // 移除非法注入节点
            console.warn(`The source "${badSource}" is invalid,removed it already.`)
})

完整代码

class HijackPreventor {
    constructor(watchNode = Array.from(document.getElementsByTagName('body'))[0],report=()=>{}) {
        this.whiteList = []
        this.whiteRegList = []
        this.filterTagList = ['script']
        this.report = report
        this.setObserver(watchNode)
    }

    /**
     * 设置域名白名单
     * @param {Array|String} list 
     */
    setWhilteList(item) {
        if (item instanceof Array) {
            this.whiteList = item
        } else if (typeof item === 'string') {
            this.whiteList.push(item)
        } else {
            console.error('[HijackPreventor]: Please set an Array or String type parameter to "setWhilteList" ')
            return;
        }
        this.whiteRegList = this.whiteList.map(wl =>
            new RegExp('/.+?\/\/' + wl + '|\/\/' + wl + '|.+?\.' + wl + '|^' + wl)
        )
    }

    /**
     * 挂载dom监听器
     * @param {Node} node 
     */
    setObserver(watchNode) {
        const observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
        const isSupportObserver = !!observer
        if (isSupportObserver) {
            console.info('[HijackPreventor]: The preventor is running...')
            new observer((records) => {
                this.filterSafeScript(records)
            }).observe(watchNode, { childList: true, attributes: true })
        } else {
            console.error('[HijackPreventor]: Your platform is not supported with "window.MutationObserver",please update.')
        }
    }

    /**
     * 获取非法注入
     * @param {Node} records 
     */
    filterSafeScript(records) {
        const { filterTagList, whiteRegList } = this
        let badInjections = []
        records.forEach(record => {
            const addedNodes = Array.from(record.addedNodes)
            addedNodes.forEach((node) => {
                if (node.tagName && ~filterTagList.indexOf(node.tagName.toLowerCase())) {
                    const isInWhiteList = whiteRegList.some((reg) => reg.test(node.src))
                    if (!isInWhiteList) {
                        badInjections.push({ badNode: node, badSource: node.src })
                    }
                }
            })
        })
        this.handleBadInjections(badInjections)
    }

    /**
     * 处理非法注入
     * @param {Array} badInjections 
     */
    handleBadInjections(badInjections) {
        badInjections.forEach(({ badNode, badSource }) => {
            badNode.remove(); // 移除非法注入节点
            console.warn(`[HijackPreventor]: The source "${badSource}" is invalid,removed it already.`)
        })
        this.report(badInjections)
    }

    /**
     * 模拟插入script,用来测试
     * @param {Node} appendNode 
     */
    mockHijack(appendNode = document.getElementsByTagName('body')[0]) {
        const node = document.createElement("script");
        node.src = 'https://cdn.bootcss.com/zepto/1.0rc1/zepto.min.js'
        appendNode.appendChild(node)
    }
}

举报方法

按下图方法投诉到工信部,一步到位!

投诉到工信部

参考链接

  1. 干货!防运营商劫持
  2. 【HTTP劫持和DNS劫持】实际JS对抗
  3. MutationObserver

2018年3月github上值得关注的开源项目

控件

  1. tippyjs -- 一个轻量级的vanilla JS工具提示库

    官方示例

  2. driver.js -- 一个轻量级的,无需依赖的JavaScript引擎,可以在整个页面中推动用户的注意力

    这个库可以用来给某个元素高亮,高度可定制化;
    官方示例

  3. scrollbooster -- 令人愉快的内容拖动滚动库

    官方示例
    demo

数据可视化

  1. tui.chart -- 生成漂亮的数据可视化的仓库

    demo

    demo

图像处理

  1. rough -- 用代码绘制手绘风格的图案,生成svg

    demo

  2. basicScroll -- 带有css变量的独立视差滚动,用于桌面和移动端

    官方示例

机器学习

  1. brain.js -- JavaScript中的神经网络

状态管理

  1. immer -- 通过改变当前的状态来创建下一个不可变状态
  2. rematch -- redux框架

CLI

  1. prompts - 轻量级,美观且用户友好的交互式提示
    demo

  2. wunderbar -- 简单的水平条形图

    demo

  3. fkill-cli -- 跨平台杀进程

  4. webpackbar -- 用于Webpack 4的优雅ProgressBar和Profiler(实验)

    demo

小程序

  1. mpvue -- 基于 Vue.js 的小程序开发框架,从底层支持 Vue.js 语法和构建工具体系。

    官网

  2. zanui-weapp -- 高颜值、好用、易扩展的微信小程序 UI 库,Powered by 有赞

区块链

  1. awesome-blockchain -- 收集所有区块链(BlockChain)技术开发相关资料,包括Fabric和Ethereum开发资料

canvas

  1. Konva.js是一个HTML5 Canvas JavaScript框架,它通过为桌面和移动应用程序启用画布交互来扩展2D上下文。

文件处理

  1. filepond -- 一个灵活有趣的JavaScript文件上传插件
    demo

React

  1. react-morph -- 变形Ui转换变得简单

    官方示例

  2. react-virtualized -- react组件高效渲染大型列表和表格数据

  3. gestalt -- Pinterest设计风格的react ui组件

    官方文档

  4. react-testing-library -- 测试React组件的一个非常轻量级的解决方案。它在react-dom和react-dom / test-utils之上提供轻型实用程序功能,以鼓励更好的测试实践。

  5. react-spring -- 帮助react-motion和animated 成为最好的朋友

    demo

RN

  1. react-native-menu -- 适用于Android和iOS的灵活下拉菜单组件,与Android的Spinner类似。

    demo

  2. react-native-elements -- 跨平台React本地用户界面工具包

    demo

    官方文档

状态管理

  1. mobx -- 简单,可扩展的状态管理。

node

  1. better-sqlite3 -- Node.js中最快和最简单的SQLite3库

脚手架

  1. multipages-generator -- 是一个像express-generator一样快速生成网站脚手架的npm模块,可以全局安装。只要一个命令即可生成多页面的express工程,是多页面webpack编译的最佳实践模板,最适合多个独立的移动端h5项目

Vue

  1. vue-content-loader -- SVG组件创建占位符加载,如Facebook card loading。

    demo

编辑器

  1. pell -- 最简单和最小的(〜1kB)所见即所得的Web文本编辑器,没有依赖关系

    demo

    官方示例

  2. marktext -- 新一代Markdown编辑器,运行在MacOS Windows和Linux平台上
    一款高性能的 Markdown 编辑器,运行于 Mac、Windows 和 Linux 平台。其简洁的外观,流程的运行,给您带来舒适的写作体验。还可以斗图LOL

播放器

  1. video.js -- 开源的HTML5和Flash视频播放器

文档/博客

  1. awesome-selfhosted -- 这是可在本地托管的免费软件网络服务和Web应用程序的列表。 Selfhosting是本地托管和管理应用程序的过程,而不是从SaaS提供商处租用。
  2. linux-command -- Linux 命令查询工具跨平台桌面版
    之前介绍过的linux-command,这个是整合出来的搜索引擎,很强大
  3. awesome-wechat-weapp -- 微信小程序开发资源汇总非常值得收藏
  4. How-to-learn-node-correctly -- 如何正确的学习Node.js 狼叔出品,必须fork一份

funny stuff

  1. hongbao -- heavy_check_mark 饿了么、美团拼手气红包辅助,一键领取手气最佳红包
    官网

  2. lipstick -- 口红颜色可视化 - 为什么你的女神总缺一支口红这个挺有意思的,如果你不知道怎么给女朋友选口红挑色号,可以看看这个项目;本来以为是爬虫,其实是写好的json;不过这样看比较直观。
    demo

  3. cows -- 用ASCII生成的一组不同形态的牛超级有意思,贴一段代码:

    .            /\         .       .
          .     /  \      .          .
               /    \   .        .    *
              /      \              *
              | (__) |   .    .   **
       .     /| (oo) |\           **
            / | /\/\ | \   .     . *
        .  /  |=|==|=|  \     .      *
       . /    | |  | |    \  .
        / USA | ^||^ |NASA \     .
       |______|  ^^  |______|       .
      .       (__||__)     .   .
         .    /_\  /_\  .     .    .
              !!!  !!!
    
    The cow that jumped over the moon.
    

    查看更多

  4. tower_game -- 盖楼游戏 html5 canvas tower building game

    demo

  5. parrot.live -- 将动画鹦鹉带到任何地方的终端

    demo

  6. oni -- 现代的模态编辑器Oni是一种新型的编辑器,专注于最大限度地提高生产力 - 将模态编辑与现代编辑期望的功能相结合。

    demo

  7. is-thirteen -- 检查一个数字是否等于13。本来以为是个很没有用的库(其实还是没啥用),可以看看代码,非常有意思

  8. text2mindmap -- 通过编写缩进列表来制作思维导图的在线工具

2017年12月github上值得关注的开源项目

数据图表相关

  1. superstruct -- 一个简单和可组合的方式来验证Javascript中的数据

  2. lowdb -- lowdb是一个由Lodash支持的小型本地JSON数据库(支持Node,Electron和浏览器)

  3. inmap -- inMap 是一款基于百度地图的大数据可视化库,专注于大数据方向的散点、热力图、网格、聚合等方式;让大数据可视化变得简单易用。

    官网

    蜂窝聚合的demo

文件处理

  1. uppy -- 下一个用于Web浏览器的开源文件上传器

    demo

动画相关

  1. popmotion -- JavaScript动作引擎。创建独特的动画和补间,物理和输入跟踪交互。

    查看官网

UI相关

  1. muuri -- 响应式,可排序,可过滤和可拖动的网格布局muuri最大的特点是可拖动,优秀的示例请查看
    官网

React相关

  1. react-show -- React的无依赖显示/隐藏组件。

    demo

  2. react-perf-devtool -- Chrome扩展程序,用于检查React组件的性能

  3. react-sketchapp -- 渲染React组件到Sketch

  4. beidou -- 服务器呈现的React应用程序的同构框架阿里出品----必属呃呃呃。。。

Vue相关

  1. vue-content-placeholders -- 用于渲染虚假(渐进)内容的可组合组件,例如vue中的Facebook
    demo

  2. vue-global-events -- 将全局事件注册为组件

  3. bootstrap-vue -- 快速将Bootstrap 4组件与Vue.js集成的组件库

    官网

  4. vue2-element-touzi-admin

RN相关

  1. react-native-typography -- React Native 中像素完美,像原生一样的印刷风格

    DEMO

  2. AC-QRCode-RN -- React Native高度可定制的二维码扫描组件
    demo

electron相关

  1. PicGo -- 一个简单而美丽的工具,用electron-vue构建的图片上传工具

    demo

架构

  1. parcel -- 快速,零配置的Web应用程序打包器

  2. microbundle -- 用于小型模块的零配置打包程序。

  3. DOClever -- 移动时代首选的接口管理平台

    官网

文档

  1. Docusaurus -- 易于维护开源文档网站。

    官网

  2. i18next -- 学习一次 - 到处翻译:i18next国际化生态系统

博客

  1. grow-to-express -- 渐进式Express学习课程,从零开始实现一个Express
  2. 30-seconds-of-code -- 精心收集的有用的JavaScript代码片段,你可以在30秒或更少的时间内理解。

小程序相关

  1. wepy -- 小程序组件化开发框架

    官网

funny stuff

  1. learn-anything -- 搜索互动地图学习任何东西
    官网最大的特点是帮你建立每个知识点的相互关联,查看下图
    demo
  2. array-explorer -- 帮助在任何时候最好的数组方法
    官方示例

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.