一、npm简介

安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍。

npm的全称:Node Package Manager.

####(1)通俗的理解

其实从字面意思就可以理解这个产品有什么作用翻译为“Node包管理器”。对,就是Node的包的一个管理工具,目前我尝试的有

  1. 下载并安装包(npm install [pkg])
  2. 升级安装包(npm update [pkg])
  3. 卸载安装包(npm uninstall/rm [pkg]),可以指定卸载包的版本号 ...

其实这些命令很简单,常用的必须记住,不常用的查询即可,这才是比较好的学习知识方式。

在终端输入:

//查看npm拥有的全部命令
$ npm --help
$ npm help
//查看某一个npm命令的详细用法
$ npm <command> --help
$ npm help <command>

####(2)专业的解释

npm(Node Package Manager)是Node.js下的主流套件管理程式。它在Node.js v0.6.x版本之后,内建于Node系统。通过npm可以协助开发者安装、卸载、删除、更新Node.js套件,并且可以通过npm发布自己的插件。

二、类似的产品

其实学习一个产品,可以联系其它产品,能够更好的理解现在手头的产品。第一次学习npm我的第一反应就是,很像linux/mac平台的很多软件,依赖管理的方式可以参考maven...当然相似性可以随便联想。

接下来,举几个例子吧,当然详细了解可以查baidu && google。

  1. gem
  2. PyPL
  3. pear
  4. macPort
  5. Homebrew
  6. rem
  7. apt-get
  8. yum ...

是不是很多都很熟悉?这样对于npm的认识就不用局限于概念啦。

三、npm基础功能

(1)npmrc文件介绍

首先介绍一下npmrc文件,这个文件是npm包管理器的配置文件。

与npmrc相关的三个文件:

  1. 用户配置文件:~/.npmrc
  2. 全局配置文件:$PREFIX/npmrc
  3. npm内部配置文件:安装npm的目录下

下面仔细看一下npm config的配置。

(2)npm获取配置的6种方式(优先级从高到低):

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会使用默认配置参数。

(4)npm install

“安装指定包”:这个命令不难,但是也有需要注意的地方,就是安装的模式有两种,在后面会单独讲解。

如果不知道包的具体名称,可以在http://search.npmjs.org上进行搜索。

(5)npm uninstall

“卸载指定包”:在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个部分:

  1. 名称
  2. 描述
  3. 作者
  4. 发布时间
  5. 发布版本号
  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是什么东西。

Node.js 是一个让 JavaScript 运行在服务端的开发平台。

三、Node.js的安装

学习了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

四、Node.js的多版本管理器n

下载地址:https://github.com/visionmedia/n

如上执行源码安装命令即可。

当然,如果你安装了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 Node.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()。

六、Node.js终于来到了浏览器

前面的例子都是在控制台里面的,没什么意思,我们接下来写一个我们典型的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代码就能够这样来请求和访问呢?我们来简单的看看源码的解析。

1. 首先我们先看看源码的http.js文件。

var Server = exports.Server = server.Server;
function createServer() { return new Server(requestListener) };

在这个文件中,我们知道createServer()方法其实返回的就是Server类,这个类是由server这个实例来的。

2. 接下来我们再追踪一下_http_server.js文件。

这个要问怎么找到这些文件的,其实是凭直觉和猜测,再加上模块化的调试方法,可以找到http.js文件的加载模块,就可以找到相应的文件了。

function requestListener() {};
function connectionListener(socket) {}
Server.prototype.setTimeout = function(msecs, callback) {};

再这个文件中,我们可以看出和Socket原理差不多,使用定时器来实现端口的监听,但是在源码中可以找到主定时器,这个概念来源于游戏开发,在全局设置定时器,这样大大提升了性能,不得不佩服作者的才能。

3. 那么我们node底层是c/c++来实现的,我们可以追踪一下node的启动。

我们先找到c语言的main文件,后来发现好多node_开头的,大楷就是系统和行一点的文件了,在node_main.cc文件中发现了:node::Start(argc, argv);函数,但是找不到具体实现,那么就肯定是在依赖文件中,通过头文件的声明,找到了,其实实现位于node.cc文件。

4. node.cc文件来看node启动流程。

函数大致的执行顺序为:

int Start(int argc, char** argv)
V8::Initialize();
CreateEnvironment() //创建当前环境
SetupProcessObject() //启动当前环境的进程
Load() //加载当前环境
context() //引用上下文
uv_run //开始异步事件运行
RunAtExit //删除异步事件链表

上面可以看出其实就是通过一系列初始化,最后达到平台的建立。

5. module的加载实质

其实我们经过上面的分析,我们大致知道的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);

6. 在module.js文件中,得到真正的js文件的加载,平台调用。

在这里作者的module数据结构设置得比较简单,抛去其它得留下结构如下:

module: {
id: "",
parent: [],
export: {},
filename,
children: []
}

这样我们这个http程序就能够很好得解释啦。其实知道了原理后面得知识就是看看api和写法了。太晚啦,睡觉觉啦 =_=...后续...

安装Node和npm前半部分的配置可以参考之前我的两篇文章:

  1. Hello Node
  2. Node npm 详解(1)

四、本地模式和全局模式

如果你了解环境变量里面的,用户变量和系统变量。可以做一个类比进行理解。当然,windows上面的环境变量概念比较好理解。

1. 本地模式

本地模式下安装包的特点

  • 不会写入PATH变量(也就是环境变量,无法在全局引用该安装包,不能在终端直接使用)
  • 能够在不同的node_modules目录,安装不同版本的安装包
  • 能够通过require()来引入安装包

使用“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这个文件夹。

2. 全局模式

全局模式安装包的特点

  • 不需要重复安装
  • 不能使用require()引入
  • 会写入PATH,并建立软链接,使用命令行的方式使用
  • 不方便指定特定的版本运行

(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的区别和联系单独写吧。其实不难,只是需要实验才能得出结果,这里区别很细节。

准备把文章拆分成几篇,写得详细了一点,这里写的话篇幅就太长了。

Node.js npm 详解的更多相关文章

  1. Node.js知识点详解(一)基础部分

    转自:http://segmentfault.com/a/1190000000728401 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的 ...

  2. node.js 路由详解

    路由的基本使用 第一步:获取url跟目录下的字符 var http = require('http'); var url = require('url') http.createServer(func ...

  3. 自制node.js + npm绿色版

    自制node.js + npm绿色版   Node.js官网有各平台的安装包下载,不想折腾的可以直接下载安装,下面说下windows平台下如何制作绿色版node,以方便迁移. 获取node.exe下载 ...

  4. Latest node.js & npm installation on Ubuntu 12.04

    转自:https://rtcamp.com/tutorials/nodejs/node-js-npm-install-ubuntu/ Compiling is way to go for many b ...

  5. Node.js npm

    Node程序包管理器(NPM)提供了以下两个主要功能: 在线存储库的Node.js包/模块,可搜索 search.nodejs.org 命令行实用程序来安装Node.js的包,做版本管理和Node.j ...

  6. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  7. Mac 下搭建环境 homebrew/git/node.js/npm/vsCode...

    主要记录一下 homebrew/git/node.js/npm/mysql 的命令行安装 1. 首先安装 homebrew  也是一个包管理工具: mac 里打开终端命令行工具,粘下面一行回车安装br ...

  8. Vue2+webpack+node 配置+入门+详解

    Vue2介绍 1.vue2.0 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. Vue 的核心库只关注视图层 采用单文件组件 复杂大型单页应用程序(SPA) 响 ...

  9. Node.js npm基础安装配置&创建第一个VUE项目

    使用之前,我们先来明白这几个东西是用来干什么的. node.js: 一种javascript的运行环境,能够使得javascript脱离浏览器运行.Node.js的出现,使得前后端使用同一种语言,统一 ...

随机推荐

  1. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  2. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...

  3. CENTOS 6.5 平台离线编译安装 Mysql5.6.22

    一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...

  4. 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)

    Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...

  5. 关于 CSS 反射倒影的研究思考

    原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...

  6. iOS开发之Alamofire源码深度解析

    今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ...

  7. [转载]SQL Server 2008 R2安装时选择的是windows身份验证,未选择混合身份验证的解决办法

    安装过程中,SQL Server 数据库引擎设置为 Windows 身份验证模式或 SQL Server 和 Windows 身份验证模式.本文介绍如何在安装后更改安全模式. 如果在安装过程中选择&q ...

  8. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  9. git提交项目到已存在的远程分支

    今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建.   之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...

  10. ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus

    ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...