一次古典互联网服务器迁移记录

严格上说,我们这一代前站长(因为现在事实上没有高活跃度会员),赶上的是 Web2.0 刚刚开始起步的那段时间。
谁能想到两三年前 PHP 已经被划作前端范畴了,而最近这一两年前端技术又这么发达了呢。
然而既然决定了保留这些互联网遗迹,那就得让他们在目前为止最好的工作状态下工作。

2007 年春,口袋根据地站长 nfopo 宣布暂时关站,同期,我们筹划成立口袋社区 Poke The BBS (当时英文名叫 Pokemon The BBS)。那时候开一个网站的成本是非常低的。互联网刚刚跨进 Web2.0 ,人人分享的平台还是每人在计算机上创建自己的网站。 CNNIC 联合国内的域名服务商推出了 1 元甚至 0 元购买 .cn 域名的活动。口袋社区最早是以 poketb.cn 作为主域名的,后来购入了同名的 .com 域名,并沿用至今。
poketb.cn whois
最早的口袋社区是 Discuz! 4.1F ,服务器是现在仍然在僵尸的梦游科技美国合租。彼时还没有智能 DNS 和 CDN 这样的高科技玩意儿,以至于现在 PTB 的代码里面还有这样的历史遗迹。
ptb 分站列表
其实后来 PTB 的命途也比较坎坷。无非就是我们比口袋根据地的站长年纪小了几分,最后大家都没有逃过高考这一关。从梦游科技迁出后, PTB 先后托管在 iFastNet 、 vultr vps 上。因为国内互联网环境日趋复杂,导致总有一些会员无法成功访问网站。这也就是导致论坛会员日趋减少的一个重要原因。
我是大概 2013 年的时候决定重新将网站开放出来的。当时的想法也比较简单,就是无论自己当年多么中二,这段记忆总还是要在的。毕竟还是一个可以向后人吹牛逼的资本:“看,你爹当年就是对这个玩意儿上瘾了” —— by liuyanghejerry
之后在潘达的帮助下我将服务器迁移到了日本的 sakura vps 。樱花当年的速度是真好,服务也比较稳定。
sakura vps
只不过美中不足的是,樱花也是个古典 vps 提供商。它们的账户甚至还需要人工去确认日本本地地址。而 vps 除了稳定之外,在性价比上更是一塌糊涂。前一年我使用单台机器承载了所有流量。这在一台双核 1G 内存的机器上来说真是个大型的挑战。要知道 MySQL + PHP-fastcgi 可是吃内存磁盘的大户。机器常常被拖得十分卡顿。于是在大概一年以前我拜托潘先生另外购买了一台同机房的 sakura 节点用于单独跑 MySQL ,并拿来做 SS 节点。
现在来看这个决策是很正确的,虽然多花了一点钱,但是可以有效承载更大的用户流量。这也为成功托管口袋双子星打下了一个良好的基础。
然后一年前接手了口袋双子星,并为其在口袋社区服务器的 php5.6 环境下运行做了大量的改动。
近几年,互联网,特别是移动互联网进一步普及,使得中国的互联网环境空前复杂。面试、考试中简单的从一台计算机 A 连接到服务器 B 这样理想的情况已经不复存在(虽然看上去还是那样的)。于是在去年晚些时候我又花了一些时间为双子、口袋社区部署了一个用于 CDN 的域名 suicune.cn 并进行了加速。
然而,还是很慢。发现原因是 sakura vps 到大陆的速度变的越来越差,于是就有了这次迁移。
这次迁移出于平衡的考虑(因为数据库节点不涉及到访问中国大陆,因此只要在日本就好),我选择了一台仍然在日本但是速度相对较好的 vps 。经过测试后有中文客服,并且速度还不错的海星云成为了我的首选。
接下来的事情就是测试一下稳定性,以决定是否继续使用了。

============2018.06.04更新。

先说结论吧:总体来说服务的稳定性没有 sakura 好。
毕竟是二道贩子嘛,比不过自建线路的地头蛇的。刚好在敏感时期,刚迁移完就发现有奇怪的问题。这次迁移之后我对 vps 本身的改动是有三个:其一,升级了 linux 内核到 4.3 ,默认开了 bbr ;其二,调整了 php5.6-fpm / php7-fpm 的编译参数,这个测试没有什么影响; 其三,测试几个小流量站点直接 Caddy – PHP ,去掉了中间的 nginx。第三条这个测试后来摘掉了,因为发现维护起来实在是太麻烦了。
总体来说还是维持 外部流量 – Caddy – Nginx – php5.6/7 – 代码 的这个逻辑。按理来说迁移应该是无感的, 因为环境配置和代码位置甚至临时文件位置都是一样的。但是依然出现了奇怪的丢包。
现在在怀疑是特殊时期导致的,等这两天过去之后再确认一下吧。

UGC 和街机音乐游戏

2011 年下半年我升入了大学。在高中被压抑了几年的打太鼓的兴趣被解放出来。
那会儿的互联网已经比较发达了。虽然还是 Web2.0 初期,但是人们已经热衷于把各种线下的情报搬到线上。
比如说,大型游戏机爱好者异地出勤(在外地去当地的游戏机厅)的时候,需要的位置信息。
当时,我们也做了一个用户主动发布记录的游戏厅位置记录网站,叫做“太鼓太鼓”。
基于ThinkPHP 3.0 做的。
啊,ThinkPHP 3.0 已经是 6 年前的事情了吗?

源代码:https://github.com/Woodu/taiko.tk

在同时期,除了贴吧、人人网等公开的信息渠道之外,还有诸如中国太鼓联盟论坛(cntaiko,已关站)等一大批基于已有程序的网站。
刚刚举的这些例子分别是几种不同的 UCG 平台,以“太鼓太鼓”为代表的程序,包括通过 mediawiki 等 wiki 建站程序建立的情报网站,是单纯的信息交换平台,这类网站没有任何社交属性,只是单纯的提供各地游戏机厅分布信息等的储存和展示。而人人网(当时)提供的公共主页之类的更类似于现在的微博金V 号,由管理者人工筛选一些跟主题相关的话题(比如游戏内容、游戏新情报或者单纯的地区交友贴),然后发动成员(会员)进行交流。

至于贴吧、 cntaiko 之类的论坛(公告板)性质的网站,其存在的社交性质是最浓厚的。这类平台是大部分玩家进行游戏外交流的主要途径。当然,除了贴吧之外的其他论坛更多的是以“大神分享——玩家讨论大神分享”为主要内容。直到今天的 BEMANICN 、 sows 等论坛,也是同样的模式,只不过现在的“大神”已经不是一个人,而是一个组织了。

上面所说的这些渠道所存在的核心价值,在于其本身能提供的信息价值能否保证会员持续留存。比如说 wiki ,里面的信息是否及时和准确,如果是作为参与者能否获得满足其需要的回报(论坛积分),再比如 BEMANICN 和 sows 提供的积分和积分所可以换取的服务(网络服务、游戏程序资源)。

并不是说论坛到现在为止就彻底失去了其意义,只是人们讨论非资源相关的吹水活动已经不可逆转地转移到了更方便发言和更难以追踪的即时通讯工具上了。

到了新时期 ( 2012 年之后 ) ,经历过论坛关站潮和贴吧清理之后,很多玩家,特别是以地区为划分的区域性玩家群体已经转为相对比较封闭的 QQ 群等方式进行日常的交流。这种方式让玩家们之间有了明确的界限,玩家之间的阶层划分变得更加明确。此时,玩家主要的交流也从简单的游戏信息交流转变成了以游戏为主题的综合社交。

由此可见,玩家之间,特别是同时期的玩家之间逐渐由公开转变为封闭社交。这带来的结果就是新、旧玩家之间的信息交流进一步割裂。除此之外,因为“熟人效应”,新玩家,特别是水平不够高或者跟老玩家认知不同的玩法的新玩家更容易遭到老玩家的排斥和抵触(舞萌游戏机“拆机”(游玩时比较用力导致机器损耗程度变快的玩法)事件、乐动魔方圈插队吵架,等等),甚至是群起而攻之。这也导致很多玩家“拒绝混圈”。

另一方面,在大型游戏机的老家日本,因为新款的游戏机台已经逐渐网游化,之前很多民间维护的信息已经由官方信息进行了取代。比如世嘉社的 maimai 和 chunithm 在 Aime.net 上都可以很方便地查找到每一台机器的所在地,这也使得最初很多民间维护的网站失去了意义。所以很多地区交流的玩家转为了直接从官方的网站分享自己的游玩记录,这也使得一些玩家间的交流变成了单纯的游戏记录分享。

梳理清楚这条脉络之后,我们也要认识到,每个人对于同一个事物的认知是有先后的。以《太鼓达人》为例,虽然目前大陆通行的太鼓达人街机依然以 10 年前的《太鼓达人 12 亚洲版》为主,依然有新的玩家进入并参与讨论。这本身是街机游戏的性质所致,即游戏本身玩法确定,以总参与人数胜过服务某一批特定玩家。其原因是街机机台本身是摆放在公共空间的,公共主页、群等作为在其之上派生出的交流渠道不可能覆盖每一个游戏机台的玩家。那么在这种情况下,每个在这些交流渠道上产生的内容它们的价值又在哪里呢?

我认为,价值主要体现在两个方面。

第一,游戏玩家确实需要一定程度的游戏外社交。大型游戏街机发展几十年,早于家用机一辈,从出现在公共场所(游戏机厅)的第一天开始,就承载了一定的社交角色。从最早的游戏机房内的社交,转变到至今的网络刷卡,在线对战,不变的核心仍然是其保留的竞技性。竞技性促使玩家投入更多的金钱(游戏币)来精进自己的技术,从而获得其他玩家的对自己的认可。这期间增加的花费也是大型游戏机设计的本意。

当然,这里面不包含给庄家送钱的垃圾赌博机。

第二,用户(游戏玩家)产生的内容可以作为游戏运营的参考。虽然整个日系游戏机已经完全退出中国市场,通过华立等代理商来进行运营,但是我们也可以看到,最初舞萌的官方运营微博——精文世嘉舞萌maimai 官方账号确实在微博上作为一个活跃度很高的存在来让各地玩家感受到游戏官方的运营诚意。即使精文世嘉已经结束运营这么多年,通过海外渠道传播进来的同款游戏的情报,也让 maimai 成为了国内为数不多的活跃且广泛的音乐游戏。

简单整理之后不难发现,一款游戏里,它们的受众是如何反馈自己从游戏处获得的信息,可以决定一款游戏的传播广度与深度。假如中国的大型游戏机市场还有第二春的话,我很期待新入局的人是怎么经营用户生产数据的。

番禺游记

这个周末去了一趟广州番禺,也就是中国最大的大型游戏机研发销售中心。有一些对于市场规模的了解,是我之前都不知道的。特别写一篇文章记录一下。

先感谢下之前常去的一家机厅,谢谢刘经理借我一个可以打听市场的时候可以用的,小有名气的名号。

华立的梁经理还对这家厅有所记忆,还特意问了那几组三国志大战怎么样了。

【新的认知】

1、截至2018年初,大型游戏机市场知名品牌变动

目前主流海外品牌的娱乐机代理(taitosnk playmorebandai namco entsegaIGS)已经几乎全部由华立完成。个人认为这种代理权的集中对于这个市场来说并不是好事情,尤其是当代理商决策失误的时候,可能阻碍进一步新机台的代理。

举例的话,参考下华立还在卖的 DM/GF V7 ?

哦对了, KONAMI 2017年下半年到现在没有新机台面向海外推出。

至于其他的,知名品牌还是那么多,基本每个品牌都会专注于自己的一部分产品,比如 pp虎 的厂家,再比如宝辉专注模拟,等等。

2、移动支付

管理系统行业依旧是五花八门。就这么说,在蔡三村公交站等车的时候旁边的女士都在向我推销他们的管理系统。但是由于中国移动支付行业的兴起,现在已经有面向无人值守,但也兼容一般机台投币器的直接微信扫码支付设备了。

乐摇摇投币器

在番禺走访的时候,基本推荐的都是这一家的这款设备。终端的竞争还没开始还是已经结束了呢?有点意思。

3、VR

VR 很有意思。世宇科技今年出了 5 款新的 VR 游戏。其中有一款跳舞机,两款模拟(骑行之类的),两款枪战。

世宇的 VR 是在 Windows 平台上,基于 HTC Vive 开发的。

跳舞机只有 12 首歌,有点少。

不过他们说还在添加。

可能还是以体验玩法为主。

其他家的话,星力动漫城有一整个区域是 VR 小镇。但是绝大部分店家还是以 VR 座椅之类的这些来作为把戏。意思不太大。

4、商业沟通模式

不得不承认,在刚刚过去的这个周六,我大概加了我从开始使用微信以来所加过的所有人的人数总和。而且绝大部分,特别是特定机台的 to B 端介绍材料绝大部分已经都是电子化的了。

啊,好想把这个 32G 的手机换个大一点的。

【实地探访指南】

已经有很多像我一样的,特别是近水楼台的广东本地的玩家已经探访过这里了。不过就我个人还是踩了一些坑的,因此列出来,供大家参考。

某种意义上的圣地巡礼,哈哈。

强烈推荐几人成行选择租车,因为公共交通不是很好。高铁站有神州租车的站点,不过这次我没有租车。

虽说没有租车,作为替代我体验了一下滴滴。路况也是比较堵的,而且有几个比较大的急弯,红绿灯也基本都是闪黄灯,何况还是连续的村落,经常有人横穿马路。如果自驾请一定注意安全。

我的出发地是北京,从北京西坐高铁或者动卧大概十个小时就可以直达广州的高铁站——广州南站。广州南站本身就在番禺,到市桥也很方便。

地铁有7号线,在长隆换3号线就可以到达市桥

市桥算是番禺的一个市中心,在地铁站附近就可以找到去动漫产业园的公交 番27或者番7 都可以。

说是动漫产业园,其实是几个连接起来的村子。这几个村子虽然都是相邻的,但是连起来也有五六公里的长度,而公交车在非高峰时期(上班、中午、下班)往往半小时到四十五分钟一趟,非常浪费时间。

这边早上一般九点半开始营业,下午能到五六点的样子。

我的建议是坐到龙美村下车,这里是新机台的起点。龙美村——蔡三村这一线有星力动漫产业园,也是华立、世宇等企业展厅的所在地。

然后从龙美村或者蔡三村接着往远离市区的方向坐车(番27或者番51/51B),新水坑开始就是一些二手机台的集散地了。

樟边村也是个上过调查报告的地方,整个村子都在做二手游戏机的回收、翻新、拆解等工作。有惊喜。

然后由于时间的关系,比较远的地方没能成行,比如金三村之类的,那边也有一些熟悉的企业在。

每个村子用大概四十多分钟就可以走完,遇到感兴趣的店可以多坐一会儿。

【传闻和传闻确认】

1、太鼓达人

国内太鼓玩家已经非常、非常少了。不过也正因为如此,剩下的玩家都是对这个游戏有着真爱的人。

在华立刚刚从官网删掉太鼓达人 12 亚洲版的时候,我就发过朋友圈,说国内已经没有正版太鼓了。这次去华立和世宇也确认了这件事情。世宇其实就卖过一阵子太鼓,早早就停了。华立也大概在一年前彻底停止了新的太鼓达人的机台的生产。

希望是引进太鼓达人新框体之前的市场空白期吧。

2、广州世嘉和一个不知道牌子的厂家

为什么对广州世嘉这个牌子这么有印象,是因为他们的 Logo 是仿照 SEGA 的风格做的。这一次去,星力动漫产业园的广州世嘉门店没有开门,神采飞扬的门店里面也没看到舞萌机台的身影。然后因为去的比较早,在园区里闲逛的时候看到了另一个 SEA 什么开头的店,也是这个风格的 Logo 。

看来神采这是打算走到黑呀。

哈哈。

3、新机台引进

去华立了解了一下奥特曼的机器,价格挺好的,不过运营成本比较高。感觉不会推的太开。

销售完全没有听说过 Project DIVA AC 的信息,可能也是因为级别不够。

【音乐游戏二手机台概述】

如果有货的话,很便宜。

DEAC 不砍价一万,真的就是纯硬件价格了。毕竟也是2600k + 不错的显卡。

部分机台价格居高不下,比如太鼓达人 12 亚,至今还在一万多元。不过想了想,就算很便宜也没地方摆。

绝大部分机器是台湾那边的机器,铁琴、音旋风之类的。

哦对了,有一台 Ez2dj 。写着写着想起来好像是之前线人给我发过。

剩下的热门,太鼓、 ubt 、 rb 、maimai 等等 普遍都没货。当地普遍认为音乐游戏机已经不再受市场欢迎了,而且流转比较快。

感觉想要淘机器开店的,要抓紧了。

不过说回来,有一些事情让我觉得很有意思。

第一件事是有一家店摆了一台 SDVX 3 ,卖家倒是很坦诚,说是摆了好多长得像学生的人进去看。

等等,我看上去有这么嫩么?哈哈

第二件事是有一家店说他们同时有太鼓达人 12 和 13 ,然后表示,节目可以随便换,反正就是复制。

第三件事,我觉得有一些厂家可能会官方回收二手机台,然后翻新了按照新的出。

嗯,我说的是 maimai 。

我也没有实锤,只是他们这个尿性,我觉得做得出来。

 

总之,番禺是个好地方,真的准备开那玩意的时候,再来好好转转。

好起来了,但是总体还是药丸的


手机啥的,直接去链接看吧。
本家 B站 https://www.bilibili.com/video/av18900448
uru B站 https://www.bilibili.com/video/av19275475/
本家 nico http://www.nicovideo.jp/watch/sm32659903
uru nico https://t.co/yfH6QPTGKF

哇哦。这首歌真的是中毒。
昨天黑兔翻唱 3 分钟之后就搬到 b 站了。之前还专门给黑兔发过邮件问有没有兴趣来自己投,可惜有版权的顾虑。
那就只好自己搬了。
看歌词都有点想哭了。2018 年了,还有人在给 miku 写曲子,还写得不错。

你们爱玩不玩,反正这个东西还是有人在关注的。
因为有资本流入,试图从中盈利,盈利不好就唱衰说没人看,
fuck you all.

昨天和朋友吃饭,聊到了一个很有意思的观点。一月番有个人类古兰经,也就是大名鼎鼎的 pop子和 pipi美 。我刚看到这个番的时候是绝望的,原因也很简单。一个玩梗番没有人科普梗,这个月没有能撑得起整个业界的番,只有吐槽番能独挡天下。
哦?国家队和京紫?呵呵。
不过有这么一个可以吐槽的点真的挺厉害的。在我国的传统氛围下,吐槽这件事情是大忌,需要去和本家进行无尽的沟通,需要注意尺度,等等。
我觉得啥时候能玩梗到随手拈来,就真的文化自信了。
毕竟我们连梁欢秀都要干掉。我并不是百分百赞同梁欢的说法,但是并不能因为这个人说话而抹杀掉。
就跟用公权力封杀 PGone 是一样的。 PGone 百分百是个傻逼,但是动用公权力干掉了一个你不喜欢的人,另外的人就可能动用公权力干掉你喜欢的人或东西。
所以,请允许我对举报国家队的那个或者那群傻逼说一声
fuck you all.

虽然刚刚吹了一波日本动漫,但是总体来说,因为平成的废物们,太君的这个产业还是药丸的。
毕竟,有钱的人开始把重点放到他们自己国家的动漫产业里面了。
反正我不看,毕竟一是没钱,二是,真尼玛什么狗屁玩意儿。

外网看到的太鼓 System256 内部电路板图

备份一下。
太鼓基于 System369 的新平台也已经 9 代了,老框体虽然早已淘汰,但是中国地区还在使用,而且也为众多玩家贡献了10年快乐的时光。虽然现在来看已经有些老旧和过时了,不过电路板真的是很漂亮啊。

System 256 with PSU and JVS IO in cage underneath
呵,还是个 12 增。
System256 with PSU

Cage top removed, front and back
下面整个是个大铁壳子,有两个变压器和 JVS 电路板。
Cage
Cage

JVS IO, top and bottom
Namco IO板,真可爱。
JVS
JVS

Filter board, front and back
这个电路板负责向 System256 提供电力并转发 JVS 电路信号。
Filter
Filter

SIF PCB between drums and JVS IO
这个电路板主要负责采集 PKS-4A10 传感器的振动信号并发送给 JVS 。
SIF Position

SIF PCB, top and bottom
特写
SIF board
SIF board

nginx前端代理导致nginx暴露监听端口问题解决

其实我还是挺想吐槽一下我国的网络管理制度的。一刀切的政策导致很多爱好者交流的地方直接就毁灭于无形之中了。比如说中华相声网,再比如更多名声更小的论坛。

中华相声网

其实这个事情很简单,在我国开论坛需要企业资质+24小时值守,这两条我我们很多爱好者性质的论坛就完全没戏。
当然有些论坛我不知道是怎么备过案的,比如某新生代,再比如某吧

算了,不扯非技术,来聊聊应付这一规定中间的一些技术难题吧。

就在前两天,我们伟大的电信网络开启了前所未有的海外网站白名单制度。不仅是在黑名单上的网站、 IP 无法访问,其他的未进行白名单备案的服务器和 IP 也只能有限的访问 22 80 443 这几个端口(经过实测有些灰色 IP 比如本机甚至只能访问 443 端口)。这就逼着我把拖延症拖了快一年的全站升级 https 的事情放上议程。

经过花花的推荐,我选择了 Caddy 对 Nginx 外面包裹一层的方法来解决这个问题。

小课堂:
Caddy是个用 Go 语言开发的轻量级 http 服务器,特点是内置了全自动续命 续期的 Let’s Encrypt 服务。而后者是有效期较短的免费 https 证书服务,旨在进一步提高互联网的安全等级,最重要的还是免费。

于是按照教程写了一万个 redirect 和 https 域名适配,之后发现一个很严重的 bug 。

根据这位仁兄博客的说法,具体的问题是:

但是访问子目录时,除非在子目录后面再加一条“/”,否则就会遇到网址自动重定向至Nginx监听的端口。假设你Nginx站点监听的端口是123,你本来访问的地址是http://domain.com/wp-admin,会自动重定向至http://domain.com:123/wp-admin

这位仁兄当然也给出了解决方案,也就是在 nginx 的 http 段增加配置:

port_in_redirect off;

然而在本机未生效。后来发现是 nginx 版本过低。具体的发现过程如下:

阅读 nginx 官方文档对这个参数的定义

http://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect

然后查看其关联指令absolute_redirect ,发现版本是1.90。
于是怒升1.8到1.12.2(上周刚发布的),搞定。

Node.js socket stream 和异步函数

考虑如下实现场景:
使用 Node.js 实现一个服务端,客户端使用 Socket 连接之后处理数据并返回。
其中,处理数据的场景中很容易出现异步函数(比如数据库查询,或者读配置文件),导致还没把 chunk 处理完,pipe就跑到下一步去了,导致客户端直接被关掉了。
查了一晚上 so 和各种官方 github ,最后还是通过读官方文档解决了。
先给出解决方案。
在 Create Server 的时候,设置 allowHalfOpen 为 true 。
官方对这一参数的解释是:
allowHalfOpen Indicates whether half-opened TCP connections are allowed. See net.createServer() and the 'end' event for details. Defaults to false.
就是允许创建的 Socket 处于半开模式(数据流暂时停止而连接仍然建立)。这样的话,就可以让处理器 (parser) 放心地去处理数据,等返回后再将处理过的 chunk 吐回到 pipe 中。
不过有一点需要注意,如果允许了 HalfOpen ,那么就一定要在处理完数据后手动关掉 Socket ,也就是文中所说的调用 Socket.end() 方法,否则的话 tcp 连接就无法正常结束了。

exp.
简单实现场景:


const server = net.createServer({allowHalfOpen :true}, (socket) => {
    socket.once('error', (err) => {
        console.log('[ERROR]');
    });

    socket
        .pipe(...)
        .pipe(through2(function(chunk,enc,callback){
            let _this = this;
            _parser.parseData(chunk).then(function(chunk){
                _this.push(chunk);
                socket.end();
            }).catch(function(err){
                _this.push(err);
                socket.end();
            });
        }))
        .pipe(...)
    .pipe(socket);
});
server.listen(..., ..., () => {
    console.log('[INFO]');
});

其中,parseData是一个使用了 asnyc 方法的函数。

初识 react-intl

5.9更新
继续踩坑。
因为要传递自定义的函数,于是将 react-router 属性中的 component 改成了 render 。结果发现props中的 match 和 history 直接不见了。原因是又踩了另外一个坑。

正确的打开姿势是:

<Match exactly pattern="/" render={(props) => <Home msg={"hello"} {...props} />} />

*还是没有超过初学者的范畴,参考 git issue : https://github.com/ReactTraining/react-router/issues/4293
=============

最近拿手头一个小项目尝试了一下 React 。项目中涉及到了国际化(其实就是中英文切换),于是(也没有第二选择地)使用了雅虎出的 react-intl
说句实在话就是文档看的有点头疼,因为 react 自带全家桶属性,而它提供的挺多东西还是没能用得上的。
开发过程中参考了两个项目:
1)https://github.com/DWboutin/react-webpack-startup
2)https://segmentfault.com/a/1190000005824920
遇到的最大的问题就是在于要提供一个切换语言的按钮。 React 的组件化让我包在最外面的整站 IntlProvider 需要一层一层地把事件传递到页面内部。
大概结构就是:


<IntlProvider ...config>
<App>
...
<Router render={()=><PageContent changeLanguageFunc={this.changeLang}/>}>
...
</App>
</IntlProvider>

然后在<PageContent/>中通过 this.props.changeLanguageFunc 来调用。如果你的这个函数还在下一级的组件里,那就要继续传递了。
这个方法主要参考的是 AlloyTeam 的这篇文章:http://www.alloyteam.com/2016/01/some-methods-of-reactjs-communication-between-components/

真正学会 React 是个漫长的过程啊~