Node.js npm 详解

一、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中输入终端的效果如图:

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 

express包的搜索结果

其实看上去复杂,只是东西有点大,不过主要包含以下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并不吃惊,先可以不管。

Mou icon

下面解释一下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

Mou icon

我们来分析一下这个简单的程序,其实从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的区别和联系单独写吧。其实不难,只是需要实验才能得出结果,这里区别很细节。

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

转载于:https://www.cnblogs.com/libin-1/p/5907175.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html怎么在图片上添加文字_Image J基础操作:给图片添加文字和标注

对图片添加标注和文字是科研图片处理中一个非常基础的操作,Image J也可以进行这方面的处理。 01利用描边和填充添加 在绘制好选区(几乎只会用到箭头工具)之后选择:Edit-Draw(描边,快捷键Ctrl+D),使用事先设定好的颜色和粗细进行绘制;也可以填充设定好的颜色Edit-Fill(填充…

怎么更改sql的实例版本_学会复杂一点的SQL语句:Oracle DDL和DML

create&#xff1a;创建表创建用户创建视图创建表create table student(id int,score int) ;student后面与括号之间可以有空格可以没有创建用户create user liuyifei identified by 4852396;drop&#xff1a;删除整个表、删除指定的用户、删除指定的存储空间drop table table_n…

再谈智能

来源&#xff1a;人机与认知实验室1. 智能的产生1.1 智能生成机理有关智能生成的机理&#xff0c;一直是许多领域关注的焦点问题&#xff0c;涉及面之广、深很是少见&#xff0c;初步梳理可能会与这样几个最基本的问题有关&#xff1a;认知生成的机理、知识生成的机理、意…

的图片怎么循环渲染_十分钟教你做个炫酷的图片切换过度效果

做个炫酷的图片切换过度效果首先&#xff0c;今天是520节日。到了520这类为情侣准备的节日&#xff0c;小编都会感到一万点暴击……首先酸一波&#xff0c;搞点事情(蹭波热度)。给大家分享一个520特效页面&#xff1a;看完记得回来为小编点个赞哦&#xff01;这是案例请扫前言老…

《自然》:修复AI神经网络的缺陷

来源&#xff1a;王宏琳科学网博客我在上一篇《海外观察》博客中&#xff0c;介绍了纽约大学马库斯教授和戴维斯教授的新书《重启 AI&#xff1a;构建我们可以信任的人工智能》和图灵奖得主朱迪亚•珀尔的著作《为什么&#xff1a;关于因果关系的新科学》。这两本书都分析了以深…

三. 自动化测试用例设计

1. 主要内容&#xff1a; 2. 手工测试用例与自动化测试用例区别 目前自动化测试更多的时候是定位在冒烟测试和回归测试&#xff1b; 冒烟测试执行的是主体功能点的用例。回归测试执行全部或部分的测试用例。3. 测试类型 4. 异常 5. WebDriver错误截图 get_screenshot_as_f…

c++卸载工具_win7系统如何卸载office2007兼容包

win7系统如何卸载office2007兼容包?office2007是一款热门的办公软件&#xff0c;但有的朋友不习惯使用office2007&#xff0c;但是一些说电脑安装office2007软件后&#xff0c;想要更换其他版本的话&#xff0c;此前需要将office2007卸载掉&#xff0c;不知怎么卸载office2007…

人工智能伦理如何设定,从种群层面看人类的知识积累和进化

前言&#xff1a;9月份中宣部出版局《中国图书评论》对《崛起的超级智能》进行了推荐和评论&#xff0c;对其中阐述的种群知识库扩展观点给予了重点关注。应该说种群知识库扩展是互联网大脑架构不断发展的抽象推论&#xff0c;这个推论对于人工智能及其伦理的建立也应有相应的价…

python可以这样学读后感_Python基础教程的读后感10篇

《Python基础教程》是一本由Magnus Lie Hetland著作&#xff0c;人民邮电出版社出版的平装图书&#xff0c;本书定价&#xff1a;69.00元&#xff0c;页数&#xff1a;471&#xff0c;文章吧小编精心整理的一些读者的读后感&#xff0c;希望对大家能有帮助。 《Python基础教程》…

光通信的再思考:5G流量爆发下的数据密度革命

来源&#xff1a;未来智库1.投资要件区别于市场的观点&#xff1a;&#xff08;1&#xff09;市场对 5G 时代流量爆发的认知不足。市场认为当前大带宽高流量新应用的爆发趋势尚不明显&#xff0c;当前流量增长需求不清。我们认为&#xff0c;5G 时代的流量的爆发将会是数十倍的…

玩家可以输入辅助指令_最后生还者 第二部辅助功能详解 盲人玩家也能玩

顽皮狗首席系统设计师Matthew Gallant&#xff0c;今天在Playstation Blog公开了《最后生还者 第二部》中辅助功能的详情。他们表示从设计之初&#xff0c;他们就希望有更多的粉丝能够体验到这款作品。在《神秘海域4&#xff1a;盗徒末路》的基础上&#xff0c;《TLOU2》提供了…

为什么深度学习如此容易被愚弄?AI研究员正在努力修复神经网络缺陷

来源&#xff1a;nature假设一辆自动驾驶汽车看到停车标志时并没有减速&#xff0c;而是加速驶入了繁忙的十字路口&#xff0c;从而导致了交通事故。事故报告显示&#xff0c;停车标志的表面粘了四个小的矩形标志。这说明一些微小扰动就能愚弄车载人工智能&#xff08;AI&#…

.net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)

PDF是一种在我们日常工作学习中最常用到的文档格式之一&#xff0c;但常常也会因为文档的不易编辑的特点&#xff0c;在遇到需要编辑PDF文档内容或者转换文件格式的情况时让人苦恼。通常对于开发者而言&#xff0c;可选择通过使用组件的方式来实现PDF文档的编辑或者格式转换&am…

h5课件制作_PPT新功能!竟然还能用来制作H5

原标题&#xff1a;PPT新功能&#xff01;竟然还能用来制作H5最近几年随着移动端的快速发展&#xff0c;我们获取信息的途径更加便捷了&#xff0c;我们几乎每天都会刷微博、看朋友圈。而在众多的信息传递中&#xff0c;H5页面成了最受大众欢迎的形式。所谓的H5&#xff0c;简单…

Nature重磅发现:神经活动影响人类寿命!

来源&#xff1a;中国生物技术网北京时间10月17日&#xff0c;发表在《Nature》上的一篇新研究中&#xff0c;来自美国哈佛医学院的科学家发现&#xff0c;长期以来与从痴呆症到癫痫等疾病有关的大脑神经活动&#xff0c;在人类衰老和寿命方面也发挥着作用。这项基于人脑、小鼠…

bootstrap 富文本_入坑吗?说说几个富文本编辑器

也许&#xff0c;你时常会遇到要开发基于Web的文本编辑器的情况。有时候&#xff0c;只需实现一个简约且轻量级的应用程序&#xff0c;不必有其他任何不必要的功能。因此&#xff0c;总能找到一种工具&#xff0c;来创建符合用户需求和资金要求的在线文本编辑器。本文将简要介绍…

战略 | 分析这25家千亿美元市值企业后,发现了这些趋势......

文章来源 |《哈佛商业评论》图片来源 | 网络编辑 | 智慧云导读&#xff1a;本文发表在《哈佛商业评论》上&#xff0c;作者通过对几百家卓越的公司进行相关调查研究&#xff0c;发现这些公司在其成功的数十年间采用的战略始终符合3个基本法则。本文在此基础上&#xff0c;对相关…

bs 程序用户个性化设置保存_想更改win10设置,这12种打开方法你不可不知,方便又快捷...

“设置”应用程序是Windows 10中最有用和最重要的应用程序之一&#xff0c;我们设置帐户、应用程序、系统、设备、网络和Internet、个性化、时间和语言、更新和安全等等都要通过它来进行。由于我们使用此应用程序比系统中的任何其他应用程序都要多&#xff0c;所以我们要熟悉打…

AR普及后的未来是怎样的?

来源&#xff1a;ARC增强现实 AR普及后的未来是怎样的&#xff1f;知名投资机构A16Z合伙人Ben Evans曾描绘AR未来场景&#xff1a;我会在你头顶上看到你的LinkedIn资料卡&#xff1b;收到Salesforce提示说你是一个重要的目标客户&#xff1b; Truecaller会提示说你打算向我推销…

python基础100_python基础100题

有四个数字&#xff1a;1、2、3、4&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;各是多少&#xff1f; def test_01(): count 0 num_lst [] for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if (i ! j) & (j ! k) and (i ! k):…