Hi,丸子

一个不正经瞎折腾的前端开发工程师,Hacking The Real World。

By

地球坐标系 (WGS-84)到火星坐标系 (GCJ-02) Javascript版

背景

第一次开发跟地图相关的应用,一开始定位获得经纬度什么的还比较顺利,直到要在地图上显示出来的时候发现位置标记跟理想的不同,虽已提前了解也预料到,但本以为某某地图会提供相关的API实现,翻了一个晚上文档都没有看到,于是就只能自己动手寻找相关算法实现,貌似没有找到Javascript版本,于是有了该移植版本的地图纠偏算法。

最新更新请移步项目地址:https://github.com/hiwanz/wgs2mars.js

快速开始

引入脚本

调用代码

返回GCJ-02坐标对象

致谢

感谢科普和其他语言版本开源作者的贡献!

坐标系科普:

【高德地图API】如何解决坐标转换,坐标偏移?

该版本算法参考了以下两位的相关实现:

C#版:地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

C语言版:ChinaMapShift

免责声明

该Javascript版本算法是基于网络上公开已知的其他语言算法实现的移植版本,作者不对其准确性和合法性做保证,请在遵守国家保密法的前提下自行斟酌使用

By

动态隐藏安卓应用图标

出于某些设计的原因,应用在安卓手机上安装并启动服务后,不再需要显示应用图标,因此需要在运行一次之后就从安卓的启动器上移除,用到的代码很简单:

顺带提一下,如果你是通过AndroidManifest.xml配置来隐藏图标的话只需要将配置里的android.intent.category.LAUNCHER这行去掉就可以了,但是会导致它无法响应消息广播,要解决这个问题就是再加一行android.intent.category.DEFAULT配置:

By

自定义Sonar代码审查规则(Javascript)

前言

在上一篇文章《代码质量管理平台Sonar》中,我们简单介绍了Sonar这个代码质量管理平台,提到了它可以定制多种开发语言的代码质量审查支持,也演示了官方的Javascript审查插件的使用,但是官方插件默认的规则是不够的,或者说不一定适用于我们团队自己的内部规范,因此,接下来来说说如何定制自己的审查规则。

扩展规则

Sonar扩展代码审查规则的方式有两种:1,使用Java编写Sonar插件;2,在SonarQube界面直接添加XPath规则。

第一种方式需要用户有Java代码编写能力,定制性强,对于大部分前端来讲要求较高,如果你有能力实现,可以根据官方提供的示例进行改造。我们主要介绍第二种方式,要求懂得XPath 1.0语法,自定义规则必须使用该规范版本的语法来遍历抽象语法树(Abstract Syntax Tree,AST),因此在编写自定义规则之前,你得先知道你所调试的代码对应的语法树是什么样子,官方提供了一个SSLR Javascript Toolkit来帮助我们方便的分析Javascript的语法树,本文使用的sslr-javascript-toolkit-1.6.jar

sslr javascript toolkit 1.6

sslr javascript toolkit 1.6

如上图所示,窗口左侧是源码区,右边是语法树信息,下面是XPath语句执行区域。源码区可以手动贴入或编写代码,也可以通过Open Source File按钮打开js文件,在手工编辑代码时需要点击Parse Source Code来生成语法树。下面的XPath执行区域就不用多说了,来演示一下。假设我们要分析的代码如下:

规则是要禁止document.write方法的使用,于是我们需要匹配代码中的document.write,首先需要看看这个方法在语法树上的节点是什么样子的,见图:

AST:document.write

AST:document.write

AST:document.write

AST:document.write

从图中我们不难看出,document.write这个调用在AST中是callExpression下的memberExpression,他的子节点primaryExpression的tokenValue为document,identifierName的tokenValue为write,因此我们得到的XPath表达式为:

我们在XPath query区域执行下我们的表达式,可以发现源码区域中的document.write为选中状态,说明我们的表达式没有问题了。

XPath:document.write

XPath:document.write

当然,你还可以优化一下表达式,让它效率更高,比如document.write由document,一个英文点号和write组成,它的memberExpression有三个子节点,可以加个前置条件count(*) = 3,表达式如下

到这里我们已经知道怎么来匹配到document.write这个调用了,那么要怎么加到SonarQube规则里呢?继续往下看。

在前一篇关于Sonar平台的介绍文章中,我们已经安装了Javascript代码审查的插件,接下来我们要在Javascript插件配置里添加一个自定义配置,操作如下:

  1. 用管理帐号登录SonarQube平台;
  2. 从Quality Profile菜单进入配置页面;
  3. 在JavaScript Profiles这一节的最右边点击Create创建一个新的配置;
  4. 点击新建的规则名,查找XPath规则模版,复制并新建规则,写入你的规则;
Create xpath rule in Sonar

Create xpath rule in Sonar

这样一条规则就创建完成了,创建好的规则默认非激活状态,需要手动勾选规则前面的复选框使之激活。

Activate javascript rule

Activate javascript rule

新建的配置需要在配置名最右侧点击Set as default后才能使用,接下来就是见证奇迹的时刻了,按照前一篇介绍的方式一样,在项目根目录中创建sonar-project.properties配置信息:

然后命令行切换到项目根目录执行一下sonar-runner,即可看到运行的结果。接下来在SonarQube平台下就可以看到审查结果啦。

Sonar projects

Sonar projects

当知道了方法之后,你就可以创建更多的审查规则,例如if语句必须使用花括号:

更多的XPath规则我会根据团队规范完整调试并分享出来,未完待续。

参考文档:

http://docs.codehaus.org/display/SONAR/Extending+Coding+Rules

By

代码质量管理平台Sonar

简介

Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

安装运行

Sonar的安装可以说是非常便利了,自带Jetty应用服务器和H2数据库,唯一的要求就是系统安装了JRE6+,到官网下载最新的安装包解压至任意目录,然后切换到解压的目录,运行一条命令即可启动平台。

当前测试环境:Red Hat Enterprise Linux Server release 5.8 (Tikanga),sonar-3.7.4。

到这里平台已经运行起来了,是不是超简单,bin目录下有各种系统版本的目录,根据你所使用的系统进入相应目录去执行sonar.sh。

sonar first run

sonar first run

系统配置

默认情况下,Sonar监听的端口是9000,如果你当前的服务器跑着其他服务(例如:php-cgi),端口可能会冲突,你需要修改一下默认配置,改变端口并且可以在服务器以外的电脑上访问,Sonar的配置文件是conf/sonar.properties。

找到上面两行,把前面的#符号去掉重启服务即可生效,这样你就可以在其他电脑上使用浏览器访问平台:http://yourserverip:9100。

Sonar默认使用内置的H2数据库,如果你希望使用自己的数据库可以修改以下配置(以mysql为例,数据库名为:sonar):

修改完配置后重启Sonar即可。特别注意,由于客户端需要,mysql要为sonar帐号配置本地和远程访问。

使用 Sonar 进行代码质量管理

系统运行起来后,我们希望它能帮我们实现代码质量检查,Sonar提供Python,Java,Javascript,C#等多种插件支持来帮助我们完成这项工作,接下来我们以Javascript检查为例来讲解如何使用它来管理我们的编码质量。

首先到插件官网找到Javascript插件,将它下载下来,放到Sonar的extensions/plugins目录下,然后重启平台服务,成功安装后可以用管理帐号登录,在Setting->Update Center里可以看到Installed Plugins列表中出现了JavaScript插件。

installed plugin

installed plugin

点击Quality Profiles菜单可以看到插件对应的配置列表,名称为Sonar way的配置是插件内置的代码检查规则,你可以点击配置名进入配置,设置规则对应的报错等级。当然你也可以通过右边的功能进行配置的创建,备份,复制,重命名和删除(插件内置配置不可删除)等操作,如果你需要自定义规则你需要对插件做二次开发,具体可以查阅http://docs.codehaus.org/display/SONAR/Extending+Coding+Rules,这里暂不做展开。

javascript sonar rules

javascript sonar rules

安装完插件后,Sonar支持一下几种方式进行代码检查:

  • Analyzing with SonarQube Runner (recommended analyzer)
  • Analyzing with SonarQube Ant Task
  • Analyzing with Maven
  • Analyzing with Gradle
  • CI Engines

官方推荐SonarQube Runner,我们就以这个方式来举例,不管是哪种方式,大致原理都是配置好客户端工具,将要检查的代码推送到平台进行检查。在你的工作电脑上,按照SonarQube Runner安装和配置文档,下载解压SonarQube Runner到任意路径,在conf/sonar-runner.properties修改服务器端的相关配置(服务器端地址,数据库连接及帐号等),添加名为SONAR_RUNNER_HOME的环境变量,值为之前解压的目录路径,添加SonarQube Runner解压目录下的bin的完整路径到path中,然后打开cmd(在Windows 7下演示)运行sonar-runner -h,正常输出如下,说明命令配置成功了

接下来在你的项目目录下新建一个sonar-project.properties文件,该文件用来配置项目相关的信息,配置的内容模版如下:

切换命令行路径到你的项目根目录,也就是上述配置所在的位置,执行sonar-runner,即可看到成功运行的结果。

sonar runner test

sonar runner test

在平台的All Project里就生成了一条记录:

sonar runner test project

sonar runner test project

点击该记录标题可以进入更详细的报表,本文测试的Javascript项目包:javascript-sonar-runner

更多的配置及相关内容请查阅官方文档。

参考文档:
http://docs.codehaus.org/display/SONAR/Setup+and+Upgrade
http://docs.codehaus.org/display/SONAR/Update+Center
http://www.sonarsource.com/products/plugins/
http://docs.codehaus.org/display/SONAR/Analyzing+Source+Code

By

centos下spm-yuan安装报错

未知原因在centos下安装spm-yuan的时候一直无法成功,报错信息如下:

搜了一圈,基本上是说

if you have installed spm, it maybe you haven’t set a NODE_PATH environment variable

我想环境变量应该没有问题,其他node模块都正常运行着

一直没有找到合适的从问题本质上解决的方案,根据Github上网友phpgcs提供的方案解决(https://github.com/spmjs/spm-build/issues/18)

安装顺利没有报错,不过跑spm yuan服务的时候提示:

直接切换到.spm下建一个cache目录即可

搞定。

By

centos下nodejs问题记录

最近搞内部系统开发,频繁跟nodejs打交道,遇到了不少莫名其妙的坑,暂时记录下,回头有时间深究到底。

系统环境:

1,nodejs环境问题

手动编译的nodejs,流程很简单,先把Python升级了,然后下载nodejs包make install。

过程很顺畅没有什么问题,安装完正常使用,至少node -v可以输出版本号,似乎已经成功安装了,但是在开发调试过程中发现,使用node的child_process.exec去执行一个node模块结果callback输出Error: Command failed: /usr/bin/env: node: No such file or directory,很奇怪有没有!!!代码都能执行,并且也回调了,可是回调报错竟然是node不存在。

快速解决方案:

2,npm link的问题

我写了一个node模块,想加入node全局调用,于是cd到模块目录npm link了下,命令正常执行,我以为一切正常,如同我在Windows下调试的那样,但是结果是:

这尼玛又是什么逆天的问题,我想一定是我node没有编译好或者是系统哪里出问题了,又是各种文件不存在,暂时没有找到问题所在。

By

Nginx多重代理: 413 Request Entity Too Large

在处理php+nginx环境下的文件上传出现:413 Request Entity Too Large,这样的报错,按照经验,对于这个问题的处理一般是下面的步骤:

1,修改nginx配置

2,在http,server或者location段修改下面的配置:

3,根据文件大小的支持情况修改,让nginx可以支持接受post过来的大数据,保存后重新加载配置,使设置生效:

上面的配置在我本机开发的时候是没有问题的,当然除此之外php本身处理上传也有相应的配置(php.ini):

这不是问题的重点,重点是我在内网一台我有权限的UED服务器上线一个内部的代码规范审核系统,UED各系统是同域名挂载不同的虚拟目录下,另一台内网UED主服务器将内审系统URL(/review)下的内容转发到我有权限配置的服务器上,不管我怎么修改配置似乎都无法解决这个问题,好像我配置没有生效,在javascript丛林群里也有群友遇到这个问题,后来排查发现,是因为我们这里实际有两重的nginx转发,当用户访问域名的时候发生了这样的事(如下图):负责URL转发的nginx把数据全量转发到我的nginx服务器,我的nginx再把数据交给php-cgi处理,第一层转发的这里配置没有按照我这台的配置修改client_max_body_size上限导致无法转发到我这台nginx,因此不管我这里怎么配都是无效的,只要第一层转发里加上配置就搞定了。

ued-servers

By

NPM本地缓存方案

如果你被前一篇《centos下搭建npm镜像》搞晕了搞挫败了搞得萎了,毕竟完整镜像npm几十G的内容需要大量的时间,期间可能遇到各种网络问题(由于某些大家都知道的原因),或者像这位哥们吐槽官方教程不给力(https://github.com/npm/npmjs.org/issues/106),你只是想简单架个本地服务而不具备太多系统或程序相关的知识,无法一下子处理各种奇葩的异常,那么你应该继续看下去。

NPM本地缓存?

在天朝网络环境下做nodejs相关开发,在我看来最痛的点就是使用npm的时候各种依赖包下载超级慢和各种异常,所以我关注的几个点:

1,下载依赖速度要快
2,不会因为npm官方镜像挂掉而影响开发
3,私有模块管理

当然,你可以常年挂着VPN,你可以找几个国内靠谱的镜像出现问题的时候切换过去,你可以内部管理模块然后npm link,就可以解决上面的问题,在这之外不妨动手自己架设一个本地服务。

找了一圈,我发现了两个cache模块:https://github.com/mixu/npm_lazyhttps://github.com/rlidwka/sinopia,这两个模块的实现彻底消除了之前完整镜像npm官方的痛,几乎是零配置,他们基本的思路基本一致:在本地运行一个服务器实例,初始化一个空的“仓库”,我们无需关心它是什么样的仓库,当用户向本地服务器发起请求时,先检查本地是否有现成的已更新的包,有则从本地仓库返回,无则从官方或指定的镜像下载请求所需要的包缓存到本地并返回给用户。从某种程度上,该逻辑解决了我们前面提到的两个问题大多数情况,因为如果你使用一个从来没使用过的模块就还是有问题。关于私有模块,sinopia提供了自己的解决方案,私有模块都建议以“local-”开头进行发布,npm_lazy则没有提及。

npm_lazy的使用

作为演示,我们选择npm_lazy快速的架设一个本地npm cache服务。

测试环境:

和其他npm模块一样,你只需一条命令,全局安装即可:

然后在终端里执行npm_lazy服务就跑起来了,是不是很简单→_→,有一点需要注意,如果你是要在内网供大家使用的,而不是本地自己用,需要修改一下配置,让它监听所有ip的请求。

修改后的配置文件config.js如下:

你需要修改的配置就是把我示例里是x.x.x.x换成你的服务器的内网ip即可,注意externalUrl和port的端口保持一致,externalUrl最后不要以/结尾,其他字段根据自己的需求调整,比如缓存时间,失败重连次数和外网镜像等。服务跑起来后,你需要设置一下你工作机的npm,将它的镜像地址改成你自己的内网服务器就可以开始使用了。

正常使用npm intall安装

npm install

npm install

sinopia的安装过程也是一样的,顺便把配置晒一下:

上述配置config.yaml是通过config_def.yaml复制改名得到的,listen的值改为0.0.0.0:4873用于监听所有ip的请求,其他配置根据需求自己定制。

npm_lazy功能相对简单,关于sinopia更多的配置信息,注意事项,以及其他类似功能的包可以看https://github.com/rlidwka/sinopia

By

使用Yeoman定制前端开发项目构建工具

Nodejs介绍

现在说起Nodejs大家肯定不陌生了,没吃过猪肉也见过猪跑,它的推广也是带着争议的,有些人或多或少会鄙视它,免不了被各种程序语言社区对比。在我开始用它之前,我也不知道它到底有什么好的。原归正传,官方的介绍如下:

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

这句话中的几个要点:1,它是基于chrome的javascript引擎编译出的平台;2,它使用事件驱动和无阻塞I/O模型;3,它是轻量高效的;4,适用于数据密集型的实时应用;5,它是跨平台的。

大概是这样,更多关于Nodejs的背景我就不再赘述,google之。有群友问我怎么学Nodejs,我的回答是,我也是最近一个月边学边开发了两个工具(重构内审规范自动化审查工具和前端开发项目初始化工具),从实际问题着手,寻找解决方案,没有系统的学,对它,我也是一知半解,它只是一个工具,实现这两个工具查官方API文档和google足够了。

yo fedp

说到前端开发项目构建不得不提鼎鼎大名的Yeoman,它定义了一个工作流,包含了三个核心工具(yo,bower和grunt)来帮你更快的构建和开发应用。这个项目自动构建的实现是Yeoman的核心脚手架工具yo帮我做了大部分工作,而我只是编写了要生成的目标项目框架模版。

开始讲如何实现工具之前,我们先来体验一下如何快速生成一个前端开发项目框架,该项目框架包含源码目录,单元测试,代码校验,文档工具,合并压缩,coffeescript编译等前端常用工具及相关配置。假设你已经完成Nodejs环境的安装配置并了解基本的命令行操作。

全局安装yo:

全局安装generator-fedp:

通过上面两条命令,你已经成功安装了yo和fedp这个项目生成器,接下来只要一条命令就可以完成前端开发项目的初始化构建,首先在命令行里切换到即将进行开发的项目目录,然后执行以下命令:

你会看到yo帮你创建之前说到的相关文件并且根据模版配置自动帮你下载所需的node模块以及这些模块的依赖模块,一阵刷屏之后,项目就构建完毕了,你只要把相关的配置(gruntfile.js,package.json或bower.json等)进行小调整就可以开始你的开发工作了。
yo-fedp

生成目录框架如下,大概意思应该都能看明白,readme文件里也有说明

project files

接下来介绍怎么实现这个过程,其实很简单,按照官方文档关于generator的介绍就可以完成一个generator的编写:http://yeoman.io/generators.html,简单讲几个要点。

yo已经为你准备开发generator做了一个generator模版,好像有点绕,意会意会,只要你装有yo和generator-generator模块,你就可以完成一个generator雏形,正如我们的fedp一样。先装个generator-generator:

然后命令行切换到你要编写generator的目录下,执行如下命令:

执行命令后,会要你输入你在Github上的用户名和仓库名,用来生成默认的配置信息,这些配置信息可以在你即将开发的generator根目录的package.json中找到并修改,当然如果你要使用Travis测试框架,也可以修改.travis.yml文件,如果有要改名的话。要注意的是,yo的generator命名规则就是generator-yourname,yourname是自定义的名称,但一定是以generator加横杠开头。当然这一步不会去检测你是否真的在Github上有这个项目,但是为了保险起见,可以在Github上创建一个,以免后面要提交npm的时候跟别人冲突了。成功生成后的目录结构如下:

generator tree

我们要实现的这个generator的逻辑和模板在app下,index.js处理如何生成目标文件和定制化的参数处理,template里存放目标文件的模版,我们现在创建了一个叫test2的generator,然后我贴出index.js并注释说明这个文件里主要代码的作用。

整个代码就这样写完了,你要做的就只是在template下创建好目录结构,然后以后的项目都是template下的文件和目录副本,这样就实现了一个generator,是不是很简单?但是这里有一些潜在的问题,不管是Github还是generator他们都不会复制空目录,也就是说如果你要放空目录,里面必须放一个文件(可以是空文件),这样可以提交到Github也可以用this.directory直接将template下的目录整个复制到目标文件夹下,而不用一直mkdir,这样也就产生了许多垃圾文件,不用担心,你可以在gruntfile里配置clean任务,在项目构建完成后一键清除这些垃圾文件。

代码调试
在你把项目提交到npm之前,要怎么调试呢?很简单,命令行切换到你的generator目录下执行下面的命令:

这样就会在node全局模块目录下建立该模块的快捷方式或软链接,之后就可以随时修改代码随时使用yo命令来测试你的generator了。

发布Nodejs模块
要发布你的generator到npm服务器上,你需要有社区帐号,你只需执行命令npm adduser,然后根据提示输入你的用户名密码等信息即可创建帐号,然后在你的generator目录下执行npm publish,没有异常的话又是一阵刷屏,然后就提示你发布成功,你可以到https://npmjs.org/上搜到你发布的模块了。发布后别人就可以跟使用其他node模块一样使用你的generator啦。

总结

如果你熟悉完整个流程后会发现,这个generator的开发几乎没有什么难度,只要你有前端开发基础,最后丢个链接给大家围观参考一下,我的generator-fedp:https://github.com/hiwanz/generator-fedp,欢迎试用反馈改进建议。

By

centos下搭建npm镜像

写在前面

对前端开发来说,nodejs你可能并不陌生,也许你不会用它来写程序,但它有很强大的模块库可以帮你在开发过程中轻松的搞定一些重复无聊的工作,例如你可以使用Grunt以及它的插件自动完成代码校验,压缩,合并,生成文档和单元测试等。如果你知道这些,那么你会了解,在用npm安装模块的时候会到境外服务器上去下载这些模块,而在天朝这种特殊的环境下,可能下载会很慢,甚至连接会被重置;或者你需要断网开发而因为临时需要某些模块而不得安装;又或者哪天某个模块已经被移除废弃了,而你接手的旧项目又需要这个模块;基于这样或那样的理由,我着手在内网搭建了个npm镜像供团队使用,期间遇到了一些问题,让我们一步一步搞定它。

安装couchdb

npmjs.org将自己的项目挂在https://github.com/isaacs/npmjs.org,需要制作镜像的同学可以按照说明来制作镜像,首先你需要安装CouchDB 1.1.0或更新的版本。

centos下输入命令:

install-couchdb

install couchdb

一阵刷屏以后couchdb就安装好了,然后启动它,你可以看到进程跑起来了

run couchdb

run-couchdb

由于couchdb默认是监听本地的请求,因此你需要配置它,让它可以接受来自局域网内的请求,将配置中的[httpd]段端口和地址前面的分号注释去掉,将127.0.0.1改成0.0.0.0然后重启服务即可

edit couchdb config

edit couchdb config

重启服务

restart couchdb

restart couchdb

然后就可以在其他机器上打开浏览器访问部署couchdb的ip和默认端口,看到Welcome信息说明安装成功了。

check couchdb in browser

check couchdb in browser

安装成功后你可以通过IP:端口/_utils/index.html访问couchdb管理界面,默认没有设置帐号密码所有人都可以访问,在界面右下角有个配置链接。

couchdb overview

couchdb overview

安装Python2.7

本来正常应该没Python什么事的,坑爹的centos的Python版本是2.4,而nodejs需要至少版本是2.6+的支持,因此在编译nodejs之前,我们需要先编译个Python2.7版本。依次执行下列命令安装,不是重点,带过~

安装完成后我们希望系统默认使用2.7版本,但是yum只能在2.4上运行,因此不能直接卸载2.4版本,需要配置yum使用2.4,而系统默认使用2.7,先备份2.4,在对Python建立软链接。

完成上面工作后,我们需要修改yum头部,让它在Python2.4下工作

将#!/usr/bin/python改为#!/usr/bin/python2.4保存退出即可。

安装同步和搜索模块

下面的步骤是根据官方在Github上的说明进行的,先把项目从Github上拉下来。

然后安装couchapp和semver模块

注意,由于运行时需要,这里的couchapp在全局和npmjs.org这个目录下都安装了,切记不要漏掉了。

会遇到问题的地方上面都过了一遍,剩下的步骤你可以按照https://github.com/isaacs/npmjs.org的步骤用curl抓取内容,也可以使用couchdb的web管理界面(http://ip:5984/_utils/replicator.html)进行同步操作,记得勾选“Continuous”让脚本不停的跑,由于数据量大,同步镜像需要很长时间,慢慢等吧。

couchdb replicator

couchdb replicator

测试使用镜像

说明文档里提到三种方式,我们直接使用全局配置把registry地址改成我们内网的即可,然后就可以跟平常一样使用npm安装模块,你会发现安装模块时请求的是内网镜像地址了。

文章中提到的ip地址记得改成你自己实际的ip地址,在镜像完成同步之前,若你使用npm命令测试安装可能看到404的结果,不要着急。

npm search

npm search

完!

参考:http://clock.co.uk/tech-blogs/how-to-create-a-private-npmjs-repository