当前位置: 首页 > 编程日记 > 正文

微信应用号开发知识贮备之altjs官方实例初探

小程序开发工具

天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生。从获得微信应用号邀请的业内人士发出来的一张开发工具源码截图可以看到,reacjs及其相应的FLUX框架altjs很有可能会成为前端开发主流。作为行业内人士,自己之前从来没有做过web及webapp开发,所以这方面算是一名小白。这段时间在忙完工作之余准备储备一下这方面的知识点,以免将来被微信应用号的浪潮所淹没。

本篇开始学习reactjs的FLUX框架altjs。学习最好的方法当然还是通过实例的阅读和改造了,但是学习之前,我们必须先要确保这些代码及其依赖的包是最新的,不然花了大时间而学习回来的是几年前的陈旧的知识就无谓了。

待通过本章将官方实例支持上最新的依赖包和工具包之后,往后会准备开几章来根据最新的altjs版本对代码进行改造,以及将打包工具从browserify改装成时下更流行的webpack,期待大家对techgogogo公众号的持续关注。

注:开始之前希望大家对reactjs和FLUX有基本的了解,可以参考最后一小节。如果现在确实没有时间去了解的,也可以先根据本章的描述将实例搭建运行起来,到时对着代码修改调试,相信很多知识点就自然而然的通了。

1. altjs官方实例下载


altjs官方提供了相应的入门实例,大家可以进入进入其官网查看:
http://alt.js.org/guide/

实例的源码可以从github获得:
https://github.com/goatslacker/alt-tutorial.git

我们首先将其clone下来:

git clone https://github.com/goatslacker/alt-tutorial.git

2. 官方实例依赖安装


这是一个基于nodejs的项目,所有的依赖必然都是在项目的package.json中配置好的。

{"name": "alt-tutorial","version": "1.0.0", "description": "A simple flux tutorial built with alt and react", "main": "server.js", "dependencies": { "alt": "^0.16.0", "react": "^0.12.2" }, "devDependencies": { "browserify": "^8.0.3", "reactify": "^0.17.1" }, "scripts": { "build": "browserify -t [reactify --es6] src/App.jsx > build/app.js", "start": "npm run build && open 'index.html' " }, "author": "Josh Perez <josh@goatslacker.com>", "license": "MIT" }

所以源码clone下来后我们首先要做的就是在项目中执行npm install去安装package.json中指定的依赖了。

npm install

3. 官方实例运行


依赖安装完后我们返回来再看下package.json中的scripts那部分配置:

{"scripts": {"build": "browserify -t [reactify --es6] src/App.jsx > build/app.js", "start": "npm run build && open 'index.html' " }, }

可以看到整个项目是通过browserify来进行构建管理的(往后我准备将其切换成更流行的webpack),而在运行命令“start“中会自动调用“build“来进行构建,构建好后就直接在浏览器中打开index.html进行显示。

所以我们现在直接调用“start“来构建并运行:

npm run start

然后默认浏览器(我的是chrome)就会打开相应的页面,我们可以点击“favorite“按钮来将相应的location加到Favorite下面:
运行页面

玩了下会发现这个例子很简单直观,就是上面显示相应的一些地名Locations,然后通过点击每个地名后面的Favorite按钮可以将对应的地名添加到下面的Favorites列表里面。

4. 依赖升级


4.1 依赖包升级状态查看

从官方实例的修改历史可以看到,该实例代码有点老了,特别是在nodejs更新迭代如此快速的今天。

altjs官方实例

我们也可以通过npm来查看依赖模块的版本情况:

npm outdate

npm update

其中:

  • Package: 依赖包的名字
  • Current: 当前安装版本
  • Wanted: Package.json中期望的版本
  • Latest: 当前市面最新的版本

4.2 软件运行依赖包升级

那么我们如何将这些依赖包批量升级到最新版本呢?我找到的一个方法是,首先将package.json中”dependencies”或”devDependencies”的所有的依赖包项设置成*号,然后再执行npm update, 然后就会获得最新版本。

我们先进行软件运行依赖包dependencies的升级:

{"name": "alt-tutorial","version": "1.0.0", "description": "A simple flux tutorial built with alt and react", "main": "server.js", "dependencies": { "alt": "*", "react": "*" }, "devDependencies": { "browserify": "^8.0.3", "reactify": "^0.17.1" }, "scripts": { "build": "browserify -t [reactify --es6] src/App.jsx > build/app.js", "start": "npm run build && open 'index.html' " }, "author": "Josh Perez <josh@goatslacker.com>", "license": "MIT" }

然后执行npm update –save来安装最新的版本并记录到package.json里面

npm update --save

安装完成后执行 npm oudate

npm outdate

npm outdate

可以看到dependencies的依赖已经更新到最新的版本(所以没有显示出来,因为这个命令是查看是否需要更新的)。但是开发工具相关的依赖devDependencies还没有更新,因为我们刚才只是将dependencies相关的依赖设置成*号来进行批量更新。

最后查看package.json可以看到dependencies已经更新到最新版本:

{"name": "alt-tutorial","version": "1.0.0", "description": "A simple flux tutorial built with alt and react", "main": "server.js", "dependencies": { "alt": "^0.18.6", "react": "^15.3.2" }, "devDependencies": { "browserify": "^8.0.3", "reactify": "^0.17.1" }, "scripts": { "build": "browserify -t [reactify --es6] src/App.jsx > build/app.js", "start": "npm run build && open 'index.html' " }, "author": "Josh Perez <josh@goatslacker.com>", "license": "MIT" }

4.3 软件开发依赖包升级


接下来我们将开发工具包devDependencies也一并更新了。同理,我们先将package.json中devDependencies相关的依赖项设置成*:

{"name": "alt-tutorial","version": "1.0.0", "description": "A simple flux tutorial built with alt and react", "main": "server.js", "dependencies": { "alt": "^0.18.6", "react": "^15.3.2" }, "devDependencies": { "browserify": "*", "reactify": "*" }, "scripts": { "build": "browserify -t [reactify --es6] src/App.jsx > build/app.js", "start": "npm run build && open 'index.html' " }, "author": "Josh Perez <josh@goatslacker.com>", "license": "MIT" }

这次我们使用npm update –save-dev命令来更新开发依赖包

npm update --save-dev

最后我们将会发现package.json中的devDependencies的依赖项也全部更新了过来:

{"name": "alt-tutorial","version": "1.0.0","description": "A simple flux tutorial built with alt and react", "main": "server.js", "dependencies": { "alt": "^0.18.6", "react": "^15.3.2" }, "devDependencies": { "browserify": "^13.1.0", "reactify": "^1.1.1" }, "scripts": { "build": "browserify -t [reactify --es6] src/App.jsx > build/app.js", "start": "npm run build && open 'index.html' " }, "author": "Josh Perez <josh@goatslacker.com>", "license": "MIT" }

这时再通过npm outdate命令将不会看到有需要升级的依赖包。到此,我们的全部依赖包都已经升级到最新。

5. AltContainer依赖包找不到错误


此时志得意满(原谅我用这个词,小白都是比较容易满足的)的我准备npm run start来一气呵成的运行起整个实例的时候,却发现根本跑不起来:

AltContainer-Error

根据提示,应该是src/component下的web组件有使用到alt的AltContainer这个包,而在升级依赖包后,这个包却找不到了。

我们首先看下代码中引用到AltContainer的地方,根据提示,打开项目的src/components文件夹,可以看到下面有一个Locations.jsx文件,打开后看到文件最开始有对AltContainer的引用:

var React = require('react');
var AltContainer = require('alt/AltContainer');

根据经验,出现这种问题的时候无非是两个原因:

  1. 这个依赖包没有正确安装
  2. 升级后的依赖包调用/引用方式变了。

发生这种事情,第一时间想到的肯定是去altjs的官网查看了。在官网的API Documentation中(链接:http://alt.js.org/docs/components/altContainer/),很明显AltContainer的引用方式已经变了:

new way to import AltContainer

引用的不再是’alt/AltContainer’,而是’alt-Container’,至于官网提示中使用的关键字’import’,猜想应该是es6最新导入方式,现在先不管,今后学习过程中有可能将这个项目的代码转换成es6,敬请期待。

所以我们这里只需要根据官网提示将引用方式改成以下就好了:

var React = require('react');
var AltContainer = require('alt-container');

当然,我们还是需要将这个依赖包给装上的:

npm install alt-container --save

这时我们再构建运行:

npm run start

会发现依然有报错,但是已经不是AltContainer引用找不到的错误了。

6. chromeDebug模块找不到错误


从以上命令的输出我们可以看到这次的错误是模块alt下的utils中找不到chromeDebug这个引用:

chromeDebug-not-found

这此在altjs官网没有找到相应的解决办法,但是问了下google,发现原来chromeDebug已经改成在alt-utils这个独立的模块的lib之下,所以只需要将相应的引用代码改一改就好了。

根据提示,找到出现问题的代码是在src/alt.js代码中:

var Alt = require('alt');
var alt = new Alt(); var chromeDebug = require('alt/utils/chromeDebug') chromeDebug(alt); module.exports = alt;

这里我们需要将chromeDebug的引用改成”alt-utils/lib/chromeDebug”:

var Alt = require('alt');
var alt = new Alt(); var chromeDebug = require('alt-utils/lib/chromeDebug') chromeDebug(alt); module.exports = alt;

然后我们安装上alt-utils模块并将依赖保存到package.json下面

npm install alt-utils --save

这时再跑“ npm run start“的时候就不会再报任何错误。

7. React.render没定义错误


但是这时打开的是空白网页,打开chrome的开发者工具查看时发现错误如下:

react.rendor not a function

原因是在最新的reactjs版本中,渲染函数应该调用的是react-dom模块中的render,而非调用react模块中的render。

追查后发现问题是处在src/App.jsx文件中:

var React = require('react');
var Locations = require('./components/Locations.jsx'); React.render( <Locations />, document.getElementById('ReactApp') );

这里我们需要改成:

var React = require('react');
var ReactDOM = require('react-dom'); var Locations = require('./components/Locations.jsx'); ReactDOM.render( <Locations />, document.getElementById('ReactApp') );

安装react-dom依赖模块:

npm install react-dom --save

然后构建运行:

npm run build

8. dispatch 函数未定义错误


这时我们查看打开的网页,可以看到Locations和Favorites两个列表的标题都已经显示出来,但是Locations下面的内容却没有显示。

打开chrome开发调试工具:

dispatch-not-found

发现是LocationActions.js中,每个action都调用了dispatch方法:

var alt = require('../alt');class LocationActions {updateLocations(locations) {this.dispatch(locations); } fetchLocations() { this.dispatch(); } locationsFailed(errorMessage) { this.dispatch(errorMessage); } favoriteLocation(location) { this.dispatch(location); } } module.exports = alt.createActions(LocationActions);

查看altjs官网得知,最新版本中我们不应该显式调用dispatch来将action分发到store,而是应该通过return来达成。所以最终的代码应该改成:

var alt = require('../alt');class LocationActions {updateLocations(locations) {return locations; } fetchLocations() { return null; } locationsFailed(errorMessage) { return errorMessage; } favoriteLocation(location) { return location; } } module.exports = alt.createActions(LocationActions);

运行npm run start命令后我们可以看到整个页面能够正常显示和操作:

page

9. 小结


作为一名小白,通过这次的实践,这里主要有几个地方需要小结下以便给自己提个醒:

  • 通过npm outdate查看当前依赖包的版本状况
  • 通过将package.json的依赖包的版本信息设置成*号,然后通过“npm update –save“ 或者“npm update –save-dev“ 可以批量将所有的依赖包升级到最新版本(这里如果有其它更好的办法的请在评论中指教)
  • 官方的reactjs-tutorial实例并没有及时更新,稍不留神就可能学到的是一些陈旧的知识
  • 碰到问题时可以先考虑去官网找答案,效率往往会比去google来得快且准确

本章的相关代码已经放到github,本人fork了alt-tutorial到alt-tutorial-webpack,大家可以clone出来然后切换到01这个branch来查看本篇文章涉及的相应代码修改。

github地址:https://github.com/kzlathander/alt-tutorial-webpack.git

10. 准备知识


如果对reactjs和flux的基本概念不清楚的,请先查看阮一峰网络日记中的相应文章:

  • reactjs基本概念:请参考阮一峰的《Flux 架构入门教程》
  • flux基本概念:请参考阮一峰的《React 入门实例教程》

<<未完待续>>

转载于:https://www.cnblogs.com/techgogogo/p/5900602.html

相关文章:

Oracle DMP 操作笔记之根据DMP逆向推导出导出的表空间名称

最近在带着一群.NET新兵们在开发和升级一套系统&#xff0c;本人虽然工作好几年&#xff0c;但是也是属于啥都懂一点&#xff0c;啥都不会的队伍&#xff0c;碰到新兵更是蛋都碎了&#xff0c;还特别拘谨&#xff0c;为啥新兵们都是基础知识很不错的&#xff0c;看来要好好练习…

【iOS】中间透明的引导蒙层

需求 如图口袋蜜蜂app一键海报的新手指引图&#xff0c;需求是遮罩层中间透明的&#xff0c;把底层的第一张海报显示出来&#xff0c;如图&#xff1a; 实现 通过UIBezierPath和CAShapeLayer绘制一张中间为透明的黑色半透明遮罩层。 步奏1、新建类PCOnePosterGuide继承自…

python连接数据库,处理数据结果后生成excel文件

# _*_coding:utf-8 _*_ import time import xlwt import os import pymysql import sys import datetime from datetime import datetime, timedelta class writefile: file r"D:\Users\xx\Desktop" #查询数据库结果 def datacommon(self,mounth,day,n,abj)…

WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程

最近在重学OpenGL,之所以说重学是因为上次接触OpenGL还是在学校里,工作之后就一直在搞D3D,一转眼已经毕业6年了.OpenGL这门手艺早就完全荒废了,现在只能是重学.学习程序最有效的办法是动手写,光看书是不行了,因为看书的时候很容易陷入对人类两大难题的思考中,以至于进展缓慢.这…

iOS与JS交互的4种方法

iOS与JS交互的方法&#xff1a; 1.拦截url&#xff08;适用于UIWebView和WKWebView&#xff09; 2.JavaScriptCore&#xff08;只适用于UIWebView&#xff0c;iOS7&#xff09; 3.WKScriptMessageHandler&#xff08;只适用于WKWebView&#xff0c;iOS8&#xff09; 4.WebV…

UDP打洞原理

1. NAT分类根据Stun协议(RFC3489),NAT大致分为下面四类1) Full Cone这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88A(192.168…

五款常用协议分析处理工具推荐

工欲善其事&#xff0c;必先利其器&#xff0c;一款好的工具&#xff0c;能取到事半功倍的效果。进行协议分析&#xff0c;好的辅助工具必不可少&#xff0c;本文推荐五款最常用且易用的协议分析工具给大家&#xff0c;包括两款综合抓包及分析工具&#xff0c;一款协议重放工具…

【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

关键词&#xff1a;android 电池 电量计 MAX17040 任务初始化宏 power_supply 平台信息:内核&#xff1a;linux2.6/linux3.0系统&#xff1a;android/android4.0 平台&#xff1a;samsung exynos 4210、exynos 4412 、exynos 5250 作者&#xff1a;xubin341719(欢迎转载&…

hihoCoder#1384 : Genius ACM

对于一个固定的区间$[l,r]$&#xff0c;显然只要将里面的数字从小到大排序后将最小的$m$个和最大的$m$个配对即可。 如果固定左端点&#xff0c;那么随着右端点的右移&#xff0c;$SPD$值单调不降&#xff0c;所以尽量把右端点往右移&#xff0c;贪心分割即可。 为了使得扫过的…

微信小程序开发 笔记

1.[wxss]设置带透明度的rgb颜色&#xff1a;rgb(0,0,0,0.5); 2.小程序使用类似于iOS的NSNotification&#xff1a;&#xff08;第三方:https://github.com/icindy/WxNotificationCenter&#xff09; (1)在需要收发通知的页面引入WxNotificationCenter&#xff1a; var WxNotifi…

简单两行,实现无线WiFi共享上网,手机抓包再也不用愁了

你是否为WiFi共享而发愁&#xff0c;各个无线共享软件&#xff0c;某某共享精灵&#xff0c;某某免费WiFi&#xff0c;某某共享大师&#xff0c;某某随身WiFi&#xff0c;一个比一个难用&#xff0c;一个比一个私货多&#xff0c;一个比一个广告多&#xff0c;如果装上了它们&a…

用C#实现的条形码和二维码编码解码器

本篇介绍可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍&#xff0c;几乎所有超市里面的商品上面都印有条形码&#xff1b;二维码也开始应用到很多场合&#xff0c;如火车票有二维码识别、网易的首页有二维码图标&#xff0c;用户只需要用手机扫描一下就可以看到手…

【iOS】通过NSURLProtocol提高Web加载速度

一.项目需求 项目中有个海报功能&#xff0c;是用UIWebView加载h5网页的形式。因为海报的使用率比较高&#xff0c;如果网页加载得比较慢会严重影响用户体验&#xff0c;因此我们想了一个方法&#xff0c;在用户启动APP后&#xff0c;如果连接了Wi-Fi&#xff0c;就将一些css和…

rand()和srand()关系很简单——一看就明白(通过一个可移植的源码)

1 函数rand和srand实现及描述 #include <stdlib.h> //供rand()使用的种子数&#xff0c;初值为1 unsigned long int next 1; /* * 描述&#xff1a;函数rand() 用于生成介于 0和RAND_MAX之间的伪随机整数序列 * 其中RAND_MAX是在头文件<stdlib.h> 中定义的…

Windows下Python 3.6 安装BeautifulSoup库

“ 介绍Python库BeautifulSoup安装。”01—BeautifulSoup库介绍Beautiful Soup是Python的一个库&#xff0c;支持Python 2和Python 3,最主要的功能是从网页抓取数据&#xff0c;即爬虫,官网介绍如下&#xff1a;Beautiful Soup provides a few simple methods and Pythonic idi…

struts2配置详解

01.Struts 2基本结构 使用Struts2框架实现用登录的功能&#xff0c;使用struts2标签和ognl表达式简化了试图的开发&#xff0c;并且利用struts2提供的特性对输入的数据进行验证&#xff0c;以及访问ServletAPI时实现用户会话跟踪&#xff0c;其简单的程序运行流程图如下 Struts…

Xcode调试技巧

1、给断点设定触发条件 如下代码&#xff0c;右键断点&#xff0c;选择Edit Breakpoint&#xff0c;设定只有i8时&#xff0c;才触发断点。 此时只有i8时&#xff0c;才触发断点。 2、断点调试时修改变量 上面代码i8成立时&#xff0c;触发短点&#xff0c;此时右击变量窗口…

MiniGUI - UNIX Domain Socket 封装

/* Returns fd if all OK, -1 on error. */ int serv_listen (const char* name);服务器调用该函数建立一个监听套接字&#xff0c;并返回套接字文件描述符。建议将服务器监听套接字建立在 /var/tmp/ 目录下。MAX_NR_LISTEN_FD 宏定义了系统能够监听的最多文件描述符数&#xf…

RSA加密算法破解及原理

“ RSA加密算法是一种非对称加密算法&#xff0c;目前被广泛应用。本文介绍RSA算法的基本原理和破解方法。”RSA在互联网上被广泛应用&#xff0c;典型的如各个网站的证书。很多应用数据的加密也是使用RSA。本文介绍RSA算法的原理&#xff0c;并介绍其破解方法和工具。01—RSA算…

SpringMvc之@RequestParam详解

RequestParam是传递参数的. RequestParam用于将请求参数区数据映射到功能处理方法的参数上。 public String queryUserName(RequestParam String userName) 在url中输入:localhost:8080/**/?userNamezhangsan 请求中包含username参数&#xff08;如/requestparam1?userNamezh…

MLeaksFinder简单实现原理

MLeaksFinder是 iOS 平台的自动内存泄漏检测工具&#xff0c;下面以demo来实现检测视图控制器是否内存泄漏&#xff0c;实现类似的功能&#xff0c;简单地了解MLeaksFinder的原理。 总体思路&#xff1a;在视图控制器弹出栈 && 视图完全消失时&#xff0c;监听对象是否…

CSipSimple 工程分析 1

有两种方法,但是个人只有一种方法可以实现build并且生成应用,那么就是直接下载Google Code CSipSimple中提供已经设置好所有的配置的额\ubuntu虚拟机镜像文件. 打开这个镜像文件需要virtual Box,这个在oracle官方网站上面有,是个免费开源的软件. Google Code : https://code.go…

干货,Wireshark使用技巧-过滤规则

“介绍Wireshark抓包时使用的过滤规则。”熟练使用Wireshark&#xff0c;对协议分析大有帮助。本文介绍抓取报文时使用的过滤规则和对已有报文的显示进行控制的显示规则。01—过滤规则使用在抓取报文时使用的规则&#xff0c;称为过滤规则&#xff0c;Wireshark底层是基于Winpc…

《图解HTTP》笔记之TCP/IP

TCP/IP 通常使用的网络&#xff08;包括互联网&#xff09;是在TCP/IP协议族的基础上运作的。把互联网相关联的协议集合起来总称为TCP/IP。而HTTP属于它内部的一个子集&#xff08;HTTP协议是建立在TCP协议之上的一种应用&#xff09;&#xff1a; TCP/IP协议族里最重要的一…

JS --正则表达式验证、实战之邮箱模式

JS验证格式&#xff1a;提高用户体验&#xff0c;验证文本。需要防止程序员的代码结构更改攻击&#xff0c;因为web段的代码有可能会被更改&#xff0c;更改后JS有可能会验证不住那么&#xff0c;C#端在JS段通过验证的情况下&#xff0c;还需要进行二次验证 <body><fo…

《ASP.NET MVC4 WEB编程》学习笔记------Web API 续

目录 ASP.NET WEB API的出现缘由 ASP.NET WEB API的强大功能 ASP.NET WEB API的出现缘由 随着UI AJAX 请求适量的增加&#xff0c;ASP.NET MVC基于JsonResult的控制器操作将无法满足高级AJAX前端的需求。如果真的出现这种情况&#xff0c;就应该好好寻找一种更简单&#xff0c;…

干货:Wireshark使用技巧-显示规则

“ 介绍Wireshark对已有报文的显示进行控制的显示规则。”之前对Wireshark抓包时使用的过滤规则进行了介绍&#xff0c;本文介绍对已有报文的显示进行控制的显示规则。掌握了显示规则&#xff0c;你使用Wireshark的动作都会炫起来。点击回顾&#xff1a;过滤规则01—显示规则使…

【转载】Linux系统与性能监控

原文: Linux System and Performance Monitoring Darren Hoch 译:Roger 这是[叔度]给我的一篇非常不错的关于Linux性能监控的文档&#xff0c;可惜是英文的&#xff0c;网上只能找到些中文节选&#xff0c;并不完整。 准备花些时间将原文共43页认真学习一下&#xff0c;顺便翻译…

iOS端Socket连接、发送数据(一)

一、Socket的应用 IM即时通讯是通过Socket的方式实现长连接&#xff0c;可运用于 &#xff08;1&#xff09;直播聊天室、礼物 &#xff08;2&#xff09;微信、QQ等即时聊天 &#xff08;3&#xff09;游戏对话、技能等 二、SOCKET原理 套接字&#xff08;socket&#x…

dataTable 从服务器获取数据源的两种表现形式

1 var table $(#example1).DataTable({2 "processing": true,//加载效果3 "autoWidth": false,4 "iDisplayLength": 25,//设置每页要显示的条数5 "lengthMenu": [[25, 50, 100], [25, 50, 100]],//设…