安装npm请阅读我以前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,若是是其它平台,有前辈写了更加详细的介绍。javascript
npm的全称:Node Package Manager.html
####(1)通俗的理解前端
其实从字面意思就能够理解这个产品有什么做用翻译为“Node包管理器”。对,就是Node的包的一个管理工具,目前我尝试的有java
其实这些命令很简单,经常使用的必须记住,不经常使用的查询便可,这才是比较好的学习知识方式。node
在终端输入:python
//查看npm拥有的所有命令 $ npm --help $ npm help //查看某一个npm命令的详细用法 $ npm <command> --help $ npm help <command>
####(2)专业的解释mysql
npm(Node Package Manager)是Node.js下的主流套件管理程式。它在Node.js v0.6.x版本以后,内建于Node系统。经过npm能够协助开发者安装、卸载、删除、更新Node.js套件,而且能够经过npm发布本身的插件。linux
其实学习一个产品,能够联系其它产品,可以更好的理解如今手头的产品。第一次学习npm个人第一反应就是,很像linux/mac平台的不少软件,依赖管理的方式能够参考maven...固然类似性能够随便联想。c++
接下来,举几个例子吧,固然详细了解能够查baidu && google。git
是否是不少都很熟悉?这样对于npm的认识就不用局限于概念啦。
首先介绍一下npmrc文件,这个文件是npm包管理器的配置文件。
与npmrc相关的三个文件:
下面仔细看一下npm config的配置。
1.命令行参数
$ --proxy http://<server>:<port>
2.环境变量
以"npmconfig"为前缀的环境变量将会被认为是npm的配置属性。 像Maven镜像的概念,方便通讯吧。
$ npm_config_proxy=http://<server>:<port>
3.用户配置文件
//查看文件路径 $ npm config get userconfig //mac系统默认路径 $HOME/.npmrc
4.全局配置文件
//查看文件路径 $ npm config get globalconfig //mac系统默认路径 /usr/local/etc/npmrc
3,4中输入终端的效果如图:
5.内置配置文件
安装npm的目录下的npmrc文件。
6.默认配置
若是前5条均未设置,npm会使用默认配置参数。
“安装指定包”:这个命令不难,可是也有须要注意的地方,就是安装的模式有两种,在后面会单独讲解。
若是不知道包的具体名称,能够在http://search.npmjs.org上进行搜索。
“卸载指定包”:在help的时候,会给你推荐npm rm 这个命令,uninstall会卸载掉包的依赖,rm。
####(6)npm ls
查看安装的包清单,其实和linux的ls命令很像,能够跟不少参数,详情可使用
$ npm help ls
####(7)npm search
搜索包的详细信息,好比咱们搜索express试试。第一次搜索,会提示创建索引,须要耐心等待片刻,你们测试的时候不要就关掉啦终端。
npm WARN Building the local index for the first time, please be patient
其实看上去复杂,只是东西有点大,不过主要包含如下6个部分:
####(8)npm update
更新安装的包
更多API能够查看官网:https://npmjs.org/doc/
在node.js中的package.json配置文件中,咱们须要配置版本号,好比0.1.2
第一位数字:主版本号
第二位数字:子版本号
第三位数字:补丁版本号
找到一个不错的介绍软件项目版本号的文章
为何要解释这个呢?确定是有用,由于npm安装的时候是能够选择版本号的,有点理解会比较好吧,至少我是这么认为的。
好久以前就想系统的学习nodejs技术了,可是因为不少事情,忙不太过来,今天晚上下定决心要入门这门技术,因此一口气看完了《Node.js开发指南》和《Node.js中文文档》,总算是真正入门了,接下来就总结一部分,剩下的只有明天再总结了。
一句话简单说明一下node.js是什么东西。
Node.js 是一个让 JavaScript 运行在服务端的开发平台。
学习了Node.js,以为若是在window下学习这门技术的话还太成熟,第三方的支持不太好,因此只介绍linux或者mac上面的安装。node.js在window上面的安装直接下载安装包,一直下一步就能够装好,环境变量也会自动配置好,npm(node package manage)在新版本也会相应的装上。
对于mac环境安装也比较简单,介绍两种安装方式。
1.homebrew(注意一直使用admin权限吧,大多都是权限文件夹,能够在终端开始使用sudo -s命令来一直使用admin权限)
$ sudo brew install node
这样下载完了就算安装上了,咱们能够来检测一下你的安装(软件配置必需要的步骤)。
# 查看node版本号 $ node -v # 查看npm版本号和清单 $ npm -v && npm list
若是npm没有安装上,那么可使用如下命令安装。
$ sudo curl http://npmjs.org/install.sh | sh
2.使用源码编译的方式(其实有方便的尽可能就避免麻烦的,嘿嘿)
下载地址:http://nodejs.org
执行典型的安装命令便可(注意到/bin目录,或者有configure文件的目录)。
$ ./configure && make && sudo make install
如上执行源码安装命令便可。
固然,若是你安装了npm,就有更方便的方式,这也是很迷人的地方。
$ sudo npm install -g n
接下来检查一下安装状况。
$ n --version
这样就可使用自由切换使用node的版本了。用以下命令安装指定版本的node。
$ n version
下载后,会默认下载到:/usr/local/n/versions/目录
若是你安装后,再使用"$ n version"命令就是指定使用的默认版本号,也可使用“$ n use version xxx.js”来暂时使用某个node版本执行xxx.js文件。
每一个语言入门均可以写一个hello xxx,示好。
在node中,这个很简单,只须要进入REPL模式,暂时不要管这个模式是什么,咱们先使用。这个用截图来直观说明一下。
进入REPL模式的命令:
$ node
接下来直接输入:
console.log("hello node.js!");
就能够在终端打印出:
>hello node.js! >undefined
写过js的应该对最后会输出undefined并不吃惊,先能够无论。
下面解释一下REPL模式:
其实这个模式不用解释,通过上面的例子应该就有直观的认识啦,相似mysql、python等的shell交互的方式,可让你输入立刻就获得反馈,输出结果到屏幕上面。在node中能够连续按两次ctrl+c退出(可是python要使用exit()函数,很不舒服)。
上面是一种最简单的方式,仍是介绍一种正规的方式吧,既然是js的运行平台,咱们就写一个js文件:hello.js,内容很简单,以下:
console.log("hello node.js!"); console.log("%d\n", 60);
在终端执行(注意要进入hello.js所在目录哦):
$ node hello.js
就能够在终端直接输出结果了。
为何我加入了“console.log('%d\n', 60);”这一句呢?那是由于这能够测试出其实能够用c语言printf的方式来写console.log()。
前面的例子都是在控制台里面的,没什么意思,咱们接下来写一个咱们典型的B/S访问的方式。固然这就离不开HTTP了,查看了一下node的源码,新版本默认是http 1.1,支持http和https这两种协议。
咱们先建一个http.js文件,里面的内容对于后台的开发人员就很熟悉了。
var http = require("http"); http.createServer(function(req, res) { res.writeHead(200, {"Content-Type": "text/html"}); res.write("<h1>Node.js</h1>"); res.end("<p>Hello Node.js</p>"); }).listen(8888); console.log("HTTP server is listening at port 8888.");
以上代码监听的port:8888,这其实就是创建了一个request,咱们在浏览器地址栏中输入:http://localhost:8888/ 便可以访问咱们打印的内容。
咱们先在终端运行后台服务:
$ node http.js
咱们来分析一下这个简单的程序,其实从require的加载方式咱们并不陌生,这是如今模块加载在前端广泛使用的函数名,那么为何咱们的js代码就可以这样来请求和访问呢?咱们来简单的看看源码的解析。
var Server = exports.Server = server.Server; function createServer() { return new Server(requestListener) };
在这个文件中,咱们知道createServer()方法其实返回的就是Server类,这个类是由server这个实例来的。
这个要问怎么找到这些文件的,实际上是凭直觉和猜想,再加上模块化的调试方法,能够找到http.js文件的加载模块,就能够找到相应的文件了。
function requestListener() {}; function connectionListener(socket) {} Server.prototype.setTimeout = function(msecs, callback) {};
再这个文件中,咱们能够看出和Socket原理差很少,使用定时器来实现端口的监听,可是在源码中能够找到主定时器,这个概念来源于游戏开发,在全局设置定时器,这样大大提高了性能,不得不佩服做者的才能。
咱们先找到c语言的main文件,后来发现好多node_开头的,大楷就是系统和行一点的文件了,在node_main.cc文件中发现了:node::Start(argc, argv);函数,可是找不到具体实现,那么就确定是在依赖文件中,经过头文件的声明,找到了,其实实现位于node.cc文件。
函数大体的执行顺序为:
int Start(int argc, char** argv) V8::Initialize(); CreateEnvironment() //建立当前环境 SetupProcessObject() //启动当前环境的进程 Load() //加载当前环境 context() //引用上下文 uv_run //开始异步事件运行 RunAtExit //删除异步事件链表
上面能够看出其实就是经过一系列初始化,最后达到平台的创建。
其实咱们通过上面的分析,咱们大体知道的node的构成,那么咱们可以在node.js(猜测:这个js文件是c和js沟通的桥梁)中,发现传入了process对象。源码结构以下:
(function(process) {}); //本地模块的加载接口 NativeModule.require();
咱们来看一看根据process来绑定c语言的模块。
var HTTPParser = process.binding("http_parser").HTTPParser;
是否是就很清晰啦,接下来咱们看看模块是怎么注册的。
//如今产生的插件会放置在node_module文件夹下应该很清晰了 //定义了一个指针结构 node_module_struct* mod //注册本身的模块 mod->register_func(Handle<Object> target) //为注册的模块设置一个上下文 mod->register_context_func //最后加载到模块缓存,这里也是实现延迟加载的本质 cache->Set(module, exports)
在模块注册后,还须要作一些准备工做才可以真正的加载到咱们的js文件。
//node.cc文件中执行绑定 static void Binding(const FunctionCallbackInfo<Value>& args); //node_javascript.cc文件中会定义你的js void DefineJavaScript(Handle<Object> target);
在这里做者的module数据结构设置得比较简单,抛去其它得留下结构以下:
module: { id: "", parent: [], export: {}, filename, children: [] }
这样咱们这个http程序就可以很好得解释啦。其实知道了原理后面得知识就是看看api和写法了。太晚啦,睡觉觉啦 =_=...后续...
安装Node和npm前半部分的配置能够参考以前个人两篇文章:
若是你了解环境变量里面的,用户变量和系统变量。能够作一个类比进行理解。固然,windows上面的环境变量概念比较好理解。
本地模式下安装包的特色
使用“npm install [@]”安装的包,默认会安装在当前目录的“node_modules”目录下(若是没有该目录,在执行命令的时候,会自动帮你建立)。
//专业的写法 ./node_modules
(1)默认采用本地模式安装
npm install <pkg>
(2)信息写入package.json文件
npm install <pkg> --save
这个命令在安装包的同时,将信息写入package.json。
@version表示指定安装包的版本号,是可选项目,默认安装最新版本。
项目路径中若是有package.json文件,使用npm install方法就能够根据dependencies配置安装全部的依赖包。
若是这样配置,当代码提交到github时,就不用提交node_modules这个文件夹。
全局模式安装包的特色
(1)采用全局模式安装
npm install -g <pkg>
(3)在mac中全局的目录
//安装包所在目录 /usr/local/lib/node_modules/ //运行命令的软连接所在目录 /usr/local/bin
(4)查看安装包路径
//查看当前包的安装路径 npm root //查看全局的包的安装路径 npm root -g
(5)设置全局模式安装目录
//设置后,以全局模式将会安装在此目录中,不过须要手动加入PATH,切记 npm config set prefix <global dir> //设置npm缓存文件的存放路径 npm config set cache <cache dir>
(6)查看默认模式
//默认返回:false $ npm get global $ npm config get global
(7)设置为默认以全局模式安装,就不用每次加"-g"参数啦。
$ npm set global=true $ npm config set global=true
npm set / npm config set与npm get / npm config get的区别和联系单独写吧。其实不难,只是须要实验才能得出结果,这里区别很细节。
准备把文章拆分红几篇,写得详细了一点,这里写的话篇幅就太长了。