React-Native Android打包发布


启动服务

    //在项目目录下执行启动服务
	npm start

生成密匙

`keytool -genkey -v -keystore my-test-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000`

代码中的 my-test-key.keystore 和 my-key-alias 替换成需要的名字。记住后续步骤中输入的密码等信息,需要用于第四步骤中的gradle脚本的编写。

下载bundle文件并保存

通过访问http://localhost:8081/index.android.bundle地址下载bundle文件保存到/android/app/src/main/assets目录下 或者执行 curl -k "http://localhost:8081/index.android.bundle" > android/app/src/main/assets/index.android.bundle

添加 gradle 的 keystore 配置

// 在 defaultConfig 后面添加
signingConfigs {
    release {
        storeFile file("/my-test-key.keystore") // 替换成你实际密匙文件所在位置
        storePassword "步骤1中的密码"  // 替换成你实际的密码
        keyAlias "my-key-alias"    // 替换
        keyPassword "步骤1中的密码"  // 替换
    }
}

// 修改原来的配置,主要是加入 signingConfig 这一行
buildTypes {
    release {
        minifyEnabled enableProguardInReleaseBuilds // 记得修改相应的功能启动
        proguardFiles fetDefaultProguardFile('proguard-android.txt), 'proguard-rules.pro' 
        signingConfig signingConfigs.release
    }
}

注意:路径中的 反斜线() 要改成 正斜线(/)。

启用 Proguard 代码混淆(可选)

Proguard 是一个 Java 字节码混淆压缩工具,可剔除项目文件夹中为使用的部分,有效减少APK的大小。在 build.gradle 文件中,启动 Proguard模块:

def enableProguardInReleaseBuilds = true

执行打包脚本

首先:进入项目根目录下的 /android/ 目录中;

然后:执行 gradle assembleRelease 命令。

注意:如果出现错误或者没有安装 gradle 工具,需要自行安装 gradle 工具和配置好 GRADLE_HOME 和 PATH,注意和 /android/gradle/wrapper/gradele-wrapper.properties 文件中的版本配置保持一致。也可以使用 gradle clean 清理一下缓存。

Read More

###360手机浏览器重复请求bug

  1. 版本: 2.5.0
  2. 手机型号: iphone6
  3. ios版本: 9.3.2

在新窗口中打开链接发现会重复请求, 2-3次, 请求不到的,关闭窗口还会请求

包含a标签,window.open和form表单提交都存在该问题。

只有单页请求的时候只请求一遍

发现 jquery(“a”).click(); 不起作用。

Read More

Web Storage (第二版)

##摘要

该规范定义了一个在客户端存储键值对数据的API。

  1. 介绍

该部分为非规范内容

该规范介绍了在客户端存储键值对的两种不同机制,类似HTTP会话中的COOKIES.

我们会遇到一种场景,用户在某地存储了一项数据,同时能够在不同的窗口中进行使用.

Cookies 并没有完好的解决该问题. For example, a user could be buying plane tickets in two different windows, using the same site. If the site used cookies to keep track of which ticket the user was buying, then as the user clicked from page to page in both windows, the ticket currently being purchased would “leak” from one window to the other, potentially causing the user to buy two tickets for the same flight without really noticing.

  1. asd

Read More

Grunt + ES6 + React 整合开发

  • 安装grunt插件

grunt-react

npm install grunt-react

grunt-babel

npm install grunt-babel

babel-preset-es2015

npm install babel-preset-es2015

babel-preset-react

npm install babel-preset-react

transform-es2015-modules-amd

npm install transform-es2015-modules-amd
  • 配置grunt

      react: {
          options: {
              es6module: true
          },
          dynamic_mappings: {
              files: [
                  {
                      expand: true,
                      cwd: 'src/jsx',
                      src: ['**/*.jsx'],
                      dest: 'src/es6',
                      ext: '.js'
                  }
              ]
          }
      },
      babel: {
          options: {
              presets: ['es2015','react'],
              "plugins": ["transform-es2015-modules-amd"]
          },
          dist: {
              files: [{
                  "expand": true,
                  "cwd": "src/jsx",
                  "src": ["**/*.jsx"],
                  "dest": "assets/js",
                  "ext": ".js"
              }]
          }
      }
    
  • 加载插件

      grunt.loadNpmTasks('grunt-react');
      grunt.loadNpmTasks('grunt-babel');
    

如需使用全局grunt和babel

修改全局babel-core/lib/transformation/file/options/option-manager.js

修改函数OptionManager.normalisePlugins中的

if (typeof plugin === "string") {
	dirname = "C:/Users/cqb32_000";
	var pluginLoc = _helpersResolve2["default"]("babel-plugin-" + plugin, dirname) || _helpersResolve2["default"](plugin, dirname);
	if (pluginLoc) {
		plugin = require(pluginLoc);
	} else {
		throw new ReferenceError(messages.get("pluginUnknown", plugin, loc, i, dirname));
	}
}

和函数OptionManager.prototype.resolvePresets中的

if (typeof val === "string") {
	dirname = "C:/Users/cqb32_000";
	var presetLoc = _helpersResolve2["default"]("babel-preset-" + val, dirname) || _helpersResolve2["default"](val, dirname);
	if (presetLoc) {
		var _val = require(presetLoc);
		onResolve && onResolve(_val, presetLoc);
		return _val;
	} else {
		throw new Error("Couldn't find preset " + JSON.stringify(val) + " relative to directory " + JSON.stringify(dirname));
	}
}

兼容ie8

要兼容IE8的话需要注意

  • 导出使用 module.exports = xxx;
  • 替换import 使用 require

Read More

如何全局使用grunt

#loadNpmTasks

我们知道grunt使用插件的时候采用loadNpmTasks方式

该函数为grunt的Task类的loadNpmTasks方法

代码大致如下:

task.loadNpmTasks = function(name) {
	loadTasksMessage('"' + name + '" local Npm module');
	var root = path.resolve('node_modules', __dirname+"../../../../");
	var pkgfile = path.join(root, name, 'package.json');
	var pkg = grunt.file.exists(pkgfile) ? grunt.file.readJSON(pkgfile) : {keywords: []};

  	// Process collection plugins.
	if (pkg.keywords && pkg.keywords.indexOf('gruntcollection') !== -1) {
		loadTaskDepth++;
		Object.keys(pkg.dependencies).forEach(function(depName) {
			// Npm sometimes pulls dependencies out if they're shared, so find
			// upwards if not found locally.
			var filepath = grunt.file.findup('node_modules/' + depName, {
				cwd: path.resolve('node_modules', name),
				nocase: true
	  		});
		  	if (filepath) {
				// Load this task plugin recursively.
				task.loadNpmTasks(path.relative(root, filepath));
	  		}
		});
		loadTaskDepth--;
		return;
  		}

	// Process task plugins.
	var tasksdir = path.join(root, name, 'tasks');
	if (grunt.file.exists(root)) {
		loadTasks(tasksdir);
	} else {
		grunt.log.error('Local Npm module "' + name + '" not found. Is it installed?');
	}
};

修改root的路径为本地安装node模块的地址即可,如:

var root = path.resolve(‘node_modules’, __dirname+”../../../../”);

Grunt-cli修改

grunt 命令使用grunt-cli,需要修改cli加载grunt模块的寻址参数 文件为: grunt-cli 中的bin/grunt

#!/usr/bin/env node

'use strict';

process.title = 'grunt';

// Especially badass external libs.
var findup = require('findup-sync');
var resolve = require('resolve').sync;

// Internal libs.
var options = require('../lib/cli').options;
var completion = require('../lib/completion');
var info = require('../lib/info');
var path = require('path');


var basedir = process.cwd();
var gruntpath;

// Do stuff based on CLI options.
if ('completion' in options) {
  completion.print(options.completion);
} else if (options.version) {
  info.version();
} else if (options.base && !options.gruntfile) {
  basedir = path.resolve(options.base);
} else if (options.gruntfile) {
  basedir = path.resolve(path.dirname(options.gruntfile));
}

basedir = "C:/Users/xxxxx";

try {
  gruntpath = resolve('grunt', {basedir: basedir});
} catch (ex) {
  gruntpath = findup('lib/grunt.js');
  // No grunt install found!
  if (!gruntpath) {
if (options.version) { process.exit(); }
if (options.help) { info.help(); }
info.fatal('Unable to find local grunt.', 99);
  }
}

// Everything looks good. Require local grunt and run it.
require(gruntpath).cli();

修改basedir参数为自己存放全局node_modules的地址。

Read More

IE8获取图片尺寸,并预览

<div class="form-group form-inline text-center" id="previewWrap">
    <img src="" id="imgPreview">
</div>
  • 获取尺寸
  • var preload = document.createElement(“div”), body = document.body, data, oriWidth, oriHeight, ratio;

    preload.style.cssText = “width:100px;height:100px;visibility: visible;position: absolute;left: 0px;top: 0px”; // 设置sizingMethod=’image’ preload.style.filter = “progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=’image’)”; body.insertBefore(preload, body.childNodes[0]); ele.select(); try { data = document.selection.createRange().text; } finally { document.selection.empty(); }

    if ( !! data) { data = data.replace(/[)’”%]/g, function(s) { return escape(escape(s)); }); //预载图片 try { preload.filters.item(“DXImageTransform.Microsoft.AlphaImageLoader”).src = data; } catch (e) { //console.log(e.description); return; } }

    oriWidth = preload.offsetWidth; oriHeight = preload.offsetHeight;

    document.body.removeChild(preload); preload = null;

  • 预览
  • var target = $(“#imgPreview”); var parent = target.parent(); var div = $(“<div>”); parent.prepend(div); div.css({ “filter”:”progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)”, position: “absolute”, left: ‘20px’, top: ‘20px’ }); div[0].filters.item(“DXImageTransform.Microsoft.AlphaImageLoader”).src = data; var w = parent.width(); var h = w/oriWidth * oriHeight; div[0].style.width = w +”px”; div[0].style.height = h +”px”; target.css({height: h+”px”});

Read More

前端文件上传

引用至 文件上传的渐进式增强

HTML5提供了一系列新的浏览器API,使得文件上传有可能出现革命性变化。英国程序员Remy Sharp总结了这些新的接口,本文在他的文章基础上,讨论如何采用HTML5的API,对文件上传进行渐进式增强,实现以下功能:

  • iframe上传
  • ajax上传
  • 进度条
  • 文件预览
  • 拖放上传

为了对这些功能有一个感性认识,你可以先看看Remy Sharp提供的范例

传统形式

让我们从最基本的开始。 文件上传的传统形式,是使用表单元素file:

<form id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" >
	<input type="file" id="upload" name="upload" /> <br />
	<input type="submit" value="Upload" />
</form>

所有浏览器都支持上面的代码。它在IE浏览器中,显示如下:

用户先选择文件,然后点击”Upload”按钮,文件开始上传。

iframe上传

传统的表单上传,属于”同步上传”。也就是说,点击上传按钮后,网页”锁死”, 用户只能等待上传结束,然后浏览器刷新,跳到表单的action属性指定的网址。 有没有办法”异步上传”,在网页不重载的情况下,完成整个上传过程呢? 在HTML5没有出现之前,只能使用iframe做到这一点。用户点击submit时, 动态插入一个iframe元素(以下代码使用了jQuery函数库)。

var form = $("#upload-form");
	form.on('submit',function() {
	// 此处动态插入iframe元素
});

插入iframe的代码如下:

var seed = Math.floor(Math.random() * 1000);
var id = "uploader-frame-" + seed;
var callback = "uploader-cb-" + seed;
var iframe = $('<iframe id="'+id+'" name="'+id+'" style="display:none;">');
var url = form.attr('action');
form.attr('target', id).append(iframe).attr('action', url + '?iframe=' + callback);

最后一行,有两个地方值得注意。首先,它为表单添加target属性,指向动态插入的iframe窗口,这使得上传结束后,服务器将结果返回iframe窗口,所以当前页面就不会跳转了。其次,它在action属性指定的上传网址的后面,添加了一个参数,使得服务器知道回调函数的名称。这样就能将服务器返回的信息,从iframe窗口传到上层页面。

服务器(upload.php)返回的信息,应该是如下形式:

<script type="text/javascript">
	window.top.window['callback'](data);
</script>

然后,在当前网页定义回调函数:

window[callback] = function(data){
	console.log('received callback:', data);
	iframe.remove(); //removing iframe
	form.removeAttr('target');
	form.attr('action', url);
	window[callback] = undefined; //removing callback
};

ajax上传

HTML5提出了XMLHttpRequest对象的第二版,从此ajax能够上传文件了。这是真正的”异步上传”,是将来的主流。上一节的iframe上传,可以用作老式浏览器的替代方案。

ajax上传代码,放在表单的submit事件回调函数中:

form.on('submit',function() {
	// 此处进行ajax上传
});

我们主要用的是FormData对象,它能够构建类似表单的键值对。

// 检查是否支持FormData
if(window.FormData) { 
	var formData = new FormData();
	// 建立一个upload表单项,值为上传的文件
	formData.append('upload', document.getElementById('upload').files[0]);
	var xhr = new XMLHttpRequest();
	xhr.open('POST', $(this).attr('action'));
	// 定义上传完成后的回调函数
	xhr.onload = function () {
		if (xhr.status === 200) {
			console.log('上传成功');
		} else {
			console.log('出错了');
		}
	};
	xhr.send(formData);
}

进度条

XMLHttpRequest第二版还定义了一个progress事件,可以用来制作进度条。 首先,在页面中放置一个HTML元素progress。

<progress id="uploadprogress" min="0" max="100" value="0">0</progress>

然后,定义progress事件的回调函数。

xhr.upload.onprogress = function (event) {
	if (event.lengthComputable) {
		var complete = (event.loaded / event.total * 100 | 0);
		var progress = document.getElementById('uploadprogress');
		progress.value = progress.innerHTML = complete;
	}
};

注意,progress事件不是定义在xhr,而是定义在xhr.upload,因为这里需要区分下载和上传,下载也有一个progress事件。

图片预览

如果上传的是图片文件,利用File API,我们可以做一个图片文件的预览。这里主要用到FileReader对象。

// 检查是否支持FileReader对象
if (typeof FileReader != 'undefined') {
	var acceptedTypes = {
		'image/png': true,
		'image/jpeg': true,
		'image/gif': true
	};
	if (acceptedTypes[document.getElementById('upload').files[0].type] === true) {
		var reader = new FileReader();
		reader.onload = function (event) {
			var image = new Image();
			image.src = event.target.result;
			image.width = 100;
			document.body.appendChild(image);
		};
		reader.readAsDataURL(document.getElementById('upload').files[0]);
	}
}

拖放上传

最后,利用HTML5的拖放功能,实现拖放上传。

先在页面中放置一个容器,用来接收拖放的文件。

<div id="holder"></div>

对它设置样式:

#holder {
	border: 10px dashed #ccc;
	width: 300px;
	min-height: 300px;
	margin: 20px auto;
}
#holder.hover {
	border: 10px dashed #0c0;
}

拖放文件的代码,主要是定义dragover、dragend和drop这三个事件。

// 检查浏览器是否支持拖放上传。
if('draggable' in document.createElement('span')){
	var holder = document.getElementById('holder');
	holder.ondragover = function () { this.className = 'hover'; return false; };
	holder.ondragend = function () { this.className = ''; return false; };
	holder.ondrop = function (event) {
		event.preventDefault();
		this.className = '';
		var files = event.dataTransfer.files;
		// do something with files
	};
}

Read More

综合/资源

  • frontend-dev-bookmarks 一个巨大的前端开发资源清单。

  • front-end-collect 分享自己长期关注的前端开发相关的优秀网站、博客、以及活跃开发者。

  • Front-end-Interview-questions 史上最全前端开发面试问题及答案

  • f2e-hub 包含AnimationUIdialogCarouselscolorimageworkflow等。

  • awesome-javascript 一系列很棒的javascript 库,资源。

  • fks 前端技能汇总,包含前端知识架构,后端知识,linux,书籍推荐等。

  • node123 node.js中文资料导航。

  • mobile-web-favorites 移动端web开发收藏夹。

  • gulp-book Gulp 入门指南

样式/UI/css

  • Semantic-UI 让你使用任何HTML标签 来表现UI控件。 这是一款语义化设计的前端框架,为攻城师而制作的可复用的开源前端框架。

  • primer CSS风格指南。

  • glue 一个生成CSS sprites的简单的命令行工具。

  • postcss 用js插件来对css进行转换,类似Sass的预编译器,但实现了模块化,并且更加强大。

  • css3 PIE 允许在IE上使用CSS3绝大部分的酷炫功能。官网:http://css3pie.com/

  • mui 轻量级css框架。

测试/工具

  • mocha 一个简单、灵活有趣的 JavaScript 测试框架,用于 Node.js 和浏览器上的 JavaScript 应用测试。

  • csscss css代码冗余分析仪,用于分析冗余 。

  • es6-tools es6 工具集,包括Grunt Tasks,Gulp Plugins,Broccoli Plugins,Brunch Plugins,Webpack plugins等等。

  • async 一个工具模块,提供了直接而强大的 JavaScript 异步功能。虽然是为 Node.js 设计的,但是它也可以直接在浏览器中使用。

  • simditor 团队协作工具 Tower 使用的富文本编辑器。

  • HTMLHint HTML 静态代码分析工具,可以集成到IDE环境或编译系统中。

  • jshint js静态代码分析工具,可以帮你检测js语法错误和潜在的问题。

  • csslint 分析和优化你的CSS样式表的工具。由[Nicholas C.Zakas][28]所写。

  • protractor 一款端对端的angular apps 测试框架。

  • casperjs 一个基于PhantomJS的开源导航脚本和测试工具。

  • Karma 自动化完成单元测试,允许你在多个浏览器里执行js代码。让你的TDD变得简单,快速,有趣。

  • jasmine 是一个简易的JS单元测试框架, 用来测试Javascript代码。

  • chai 一个针对 Node.js 和浏览器的TDD(测试驱动开发)/BDD(行为驱动开发)的断言框架,可与任何 JavaScript 测试框架集成。

  • Qunit 一个很容易使用的js单元测试框架,该框架是由jQuery团队的成员所开发,并且是jQuery的官方测试套件。

Workflow/构建工具

  • Grunt 基于Node.js的项目构建工具。拥有数量庞大的插件,是一款优秀的前端自动化工具。

  • yeoman 一个强健的工具,库,及工作流程的组合。

  • gulp 基于node.js流的新一代前端构建系统。

  • spm 是 CMD 的包管理工具,需要和 Sea.js 配合使用。

canvas/数据可视化

  • echarts 基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。

  • Chart.js 使用标签的简易HTML5图表。

  • sketch.js 跨平台JavaScript创意编码框架,gzip压缩后仅有2kb。

  • d3 一个基于数据操作文档的js数据可视化框架,最流行的可视化库之一。

  • zrender 一个轻量级的Canvas类库,MVC封装,数据驱动,提供类DOM事件模型,让canvas绘图大不同!

  • c3 一个基于 D3.js 的可重用 JavaScript 图表库。几乎零学习曲线。

  • img2css 将图片转为纯css代码。

模块管理/加载器

  • ESL 是一个浏览器端、符合AMD的标准加载器,适合用于现代Web浏览器端应用的入口与模块管理。

ESL vs RequireJS

体积更小 (Smaller)
性能更高 (Higher performance)
更健壮 (More Robustness)
不支持在非浏览器端使用 (Browser only)
依赖模块用时定义 (Lazy define) - seajs 一个遵循`CommonJS`规范的`JavaScript`模块加载器。提供简单、极致的模块化开发体验。
  • Component 一个模块化的JavaScript框架,同时也是面向前端的包管理器。

  • webpack一个模块打包工具,你可以使用WebPack管理你的模块依赖,并编绎输出模块们所需的静态文件。

动画

  • animate.css 一个跨浏览器的CSS动画库。简单易用易上手。

  • move.js 极小的 JavaScript 库,支持 CSS3 的动画效果,非常简单优雅。

  • TweenJS 是一个简单但强大的 Javascript 动画库。CreateJS 套件的一部分。

  • bounce.js 一个用于制作漂亮的 CSS3 关键帧动画的 JavaScript 库,使用其特有的方式生成的动画效果。

  • Swipe 号称最精确的Slider触摸库,专为移动设备优化。

  • tween.js 一款可生成平滑动画效果的js动画库。tween.js允许你以平滑的方式修改元素的属性值。它可以通过设置生成各种类似CSS3的动画效果。

  • parallax.js轻量级的的视差引擎,能对智能设备的方向作出反应。

插件

  • zepto.fullpage 专注于移动端的全屏滚动插件。

  • fullPage.js pc端的全屏滚动插件。 view demo

  • onepage-scroll 可以轻松建立一个动感的响应式的滚动效果页面,比较适用于单页面的专题站。支持现代浏览器和IE8以上版本。View demo

  • slick 一款完全响应式的 jQuery 图片滚动插件,能够根据容器自动适应宽度。view demo

  • superslides 致力于解决网站大部分特效展示问题。网站上常用的“焦点图/幻灯片”“Tab标签切换”“图片滚动”“无缝滚动”等只需要一个SuperSlide即可解决! view demo

  • jQuery-One-Page-Nav 当用户滚动网页时,实现平滑滚动和智能导航。

  • slider 一个jquery完全开源的JavaScript代码库,用户可以开发,调试和深度定制自己的滑块。view demo

  • github-hovercard github 鼠标悬停显示用户,仓库等摘要信息。

  • onepage-scroll 一款带有背景视觉差效果的jQuery整页滚动特效插件。view demo

  • justlazy.js 轻量级js图片延迟加载插件。

框架、库和组件

  • polymer web组件构建框架。一套以“一切皆组件、最少化代码量、最少框架限制”为设计理念的Web UI框架。

  • impress.js 创建令人兴奋的演示。使用CSS3的转换和过渡,这个库允许你创建令人印象深刻的演示文稿。view demo

  • ionic 先进的HTML5 移动端开发框架。帮助开发者使用HTML5, CSS3和js做出不可思议的hybrid app。

  • reveal.js 基于CSS3的3D幻灯片工具。能够制作绚丽的演示文稿并生成HTML格式,将它发布到web上。 view demo

  • pure.css 一组很小的,响应式的css组件,你可以在网页的项目上到处使用。

  • three.js 是JavaScript编写的WebGL第三方库。提供了非常多的3D显示功能。

  • TimelineJS 轻松制作时间轴。

  • jquery-pjax 对ajax 和 pushState的封装,让你可以很方便的使用pushState技术,用以实现页面无刷新加载。

  • highlight.js javascript语法高亮。既可以运行在浏览器端也可以运行在服务端。

  • commander.js Node.js命令行工具。

  • togetherjs 由Mozilla打造的一款可以给网站添加实时协作功能的JavaScript库。

  • HTML.js 轻量级的简化与DOM操作的js库。view demo

  • MEAN.JS 全栈式javascript,使用MongoDB, Express,AngularJS和Node.js。star:2.2K

  • wechat.js 微信相关的 js 操作:分享、网络、菜单。

  • JavaScript-Load-Image 一个js加载和转换图像文件的库。

  • progress.js 一个 js 和 CSS3的库,帮助开发人员为网页上的每个对象创建和管理进度条效果。 view demo

  • foundation 号称世界上最先进的响应式前端框架,也是一款Mobile First的框架。

  • Sugar 一个JavaScript库。它扩展了现有的JS对象的方法,让你可以用更少的代码做更多的事情。

  • todomvc 帮你挑选一款MV框架,它使用不同的最流行的js MV框架实现了一个相同的Todo应用。

  • yepnope.js 这是一个异步的条件加载框架,速度超快,只为用户加载需要的脚本。使用非常简单,非常有用!

  • Material UI 是一个 CSS 框架和一组实现谷歌 Material Design 设计规范的 React组件。

  • Pikaday 是一个 JavaScript 日期选择器,特点是轻量级、无依赖和模块化的CSS。view demo

  • vuejs 用于构建交互式的 Web 界面的库。它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单、灵活的 API。

  • meteor 超简单的,数据库无处不在的,用于自动化和简化实时运行的 Web 应用程序的开发。纯JavaScript的Web框架。

  • webuploader 一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。支持大文件分片并发上传,极大的提高了文件上传效率。

  • fastclick触摸UI上的消除点击延迟js库。

  • wangEditor 轻量级web富文本框。

  • benchmark.js是强大的基准测试库,几乎适用于所有JavaScript平台。支持high-resolution定时器,并返回重要的统计结果。

  • headroom.js是一个轻量级、纯 JS 组件,用来隐藏或展现页面上的元素,为你的页面留下更多展示内容的空间。

移动端

  • Swipe 加速移动触摸滑块与硬件之间的转换。

  • hammer.js 一个支持多点触摸的手势库。

  • amDoc 无线Web解决方案 - 文档规范指南

  • amazeui 移动优先的跨屏前端框架。面向HTML5开发,使用css3做动画和交互。

  • Zepto 一款面向移动端设备、API与jQuery兼容的基础库。

  • mui 最接近原生APP体验的高性能框架 。

  • Swiper纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。能实现触屏焦点图、触屏Tab切换、触屏多图切换等常用效果。

React相关

  • react-style 是 React.js 可维护的样式组件

  • react-component 基于reactjs的组件。

  • react-native 一个用React构建native apps的框架。

  • react-native-guide 汇集了react-native学习资源与各类开源app。

  • awesome-react 关于react的工具,资源,视频的集合。

  • Flux 是一个Facebook开发的、利用单向数据流实现的应用架构,用于ReactFlux应用有三个主要的部分组成:调度程序、存储和视图(React 组件)。

  • iscroll 高性能,体积小,无外部依赖,跨平台的滚动组件

Read More