node.js入门
win10安装node.js
node.js官网:http://nodejs.cn/download/
1、下载安装node.js,默认也把npm勾选安装了,选择安装路径,例如:D:\Program Files\nodejs\。npm -version命令检查npm安装是否成功
2、配置环境变量

常用命令
node -v # node版本号
npm -v # 包管理器版本号
Ubuntu18.04安装node.js
sudo apt install nodejs # 使用 apt 安装 node sudo apt install npm # 使用 apt 安装 npm
ubunu 18.04 无法安装npm
Reading package lists... Done Building dependency tree Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: npm : Depends: node-gyp (>= 0.10.9) but it is not going to be installed E: Unable to correct problems, you have held broken packages.
使用下面的命令安装
sudo apt install aptitude sudo aptitude install npm
遇见这个选项:
Keep the following packages at their current version: 1) libssl-dev [Not Installed] 2) node-gyp [Not Installed] 3) nodejs-dev [Not Installed] 4) npm [Not Installed] Accept this solution? [Y/n/q/?] ?
如果选y,没什么用,先选?再选n就安装成功了,我也不知道为什么(我的按Y就好了,上面是参考)
升级node
利用n来管理版本
sudo npm install -g n
- -g:全局安装;
- --save:将保存配置信息至package.json;
- -dev : 保存至package.json的devDependencies节点 ;
n来下载node版本
sudo n lts 长期支持 sudo n stable 稳定版 sudo n latest 最新版 sudo n 8.4.0 直接指定版本下载
切换版本
sudo n
直接键盘上下移动选择你要的版本,回车确认
或者直接指定版本
sudo n 8.10.0
查看node版本
node -v 注意本终端下查看有可能没有变化,选择新建一个终端查看
升级npm
sudo npm i -g npm
使用国内镜像
由于有些npm有些资源被屏蔽或者是国外资源的原因,经常会导致用npm安装依赖包的时候失败,所有我还需要npm的国内镜像---cnpm。安装cnpm
npm install -g cnpm --registry=http://registry.npm.taobao.org
NRM安装
npm i nrm -g # 安装全局nrm包 nrm ls # 查看当前所有可用的镜像地址以及当前所使用的镜像地址 # 切换不同的镜像地址 nrm use npm nrm use taobao
源码安装
node tar.xz 文件位置打开终端,如下
$ ls node-v11.8.0-linux-x64.tar.xz
分别在终端中执行如下命令, 先设置对应的变量,然后将二进制存档文件解压到 /usr/local/lib/nodejs 目录
VERSION=v11.8.0 DISTRO=linux-x64 sudo mkdir /usr/local/lib/nodejs sudo tar -xJvf node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs sudo mv /usr/local/lib/nodejs/node-$VERSION-$DISTRO /usr/local/lib/nodejs/node-$VERSION
设置 Node 环境变量
export NODEJS_HOME=/usr/local/lib/nodejs/node-$VERSION/bin export PATH=$NODEJS_HOME:$PATH
刷新 profile 文件
. ~/.profile
测试安装结果(当前终端会看到安装成功,可以正常显示对应的安装版本,重新打开一个新的终端是提示没有安装成功的)
$ node -v v11.8.0 $ npm -v 6.5.0
创建 sudo 链接
sudo ln -s /usr/local/lib/nodejs/node-$VERSION/bin/node /usr/bin/node sudo ln -s /usr/local/lib/nodejs/node-$VERSION/bin/npm /usr/bin/npm sudo ln -s /usr/local/lib/nodejs/node-$VERSION/bin/npx /usr/bin/npx
重新打开一个终端测试 node npm npx 版本
w@w:~$ node -v v11.8.0 w@w:~$ npm -v 6.5.0 w@w:~$ npx -v 6.5.0
用vue-cli构建项目
在命令行中运行命令 ,然后等待安装完成。(注意,这里使用cnpm来替代npm,不然速度超级慢,会导致卡在那)
cnpm install -g vue-cli
通过以上三部,我们需要准备的环境和工具都准备好了,接下来就开始使用vue-cli来构建项目。
要创建项目,首先我们要选定目录,然后再命令行中把目录转到选定的目录。在这里,我选择桌面来存放新建的项目,则我们需要先把目录cd到桌面,如下图。
cd D:\workspace\node
vue init webpack firstvue
运行初始化命令的时候回让用户输入几个基本的选项,如项目名称,描述,作者等信息,如果不想填直接回车默认就好。
3安装项目所需的依赖
要安装依赖包,首先cd到项目文件夹(firstVue文件夹),然后运行命令 cnpm install ,等待安装。
这就是整个项目的目录结构,其中,我们主要在src目录中做修改。这个项目现在还只是一个结构框架,整个项目需要的依赖资源都还没有安装,如下图。运行项目
在项目目录中,运行命令 npm run dev ,会用热加载的方式运行我们的应用,热加载可以让我们在修改完代码后不用手动刷新浏览器就能实时看到修改后的效果。
这里简单介绍下 npm run dev 命令,其中的“run”对应的是package.json文件中,scripts字段中的dev,也就是 node build/dev-server.js命令的一个快捷方式。
项目运行成功后,浏览器会自动打开localhost:8080(如果浏览器没有自动打开,可以手动输入)。运行成功后,会看到如下所示的界面
作者:夜息白鸽
链接:https://www.jianshu.com/p/4f744c935e1c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[NodeJS] 优缺点及适用场景讨论
概述:
NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢?
本文就个人使用经验对这些问题进行探讨。
一. 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. 它是一个Javascript运行环境
2. 依赖于Chrome V8引擎进行代码解释
3. 事件驱动
4. 非阻塞I/O
5. 轻量、可伸缩,适于实时数据交互应用
6. 单进程,单线程
二. NodeJS带来的对系统瓶颈的解决方案
它的出现确实能为我们解决现实当中系统瓶颈提供了新的思路和方案,下面我们看看它能解决什么问题
1. 并发连接
举个例子,想象一个场景,我们在银行排队办理业务,我们看看下面两个模型
(1)系统线程模型:

这种模型的问题显而易见,服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了
(2)多线程、线程池模型:
[图片上传中。。。(2)]
这个模型已经比上一个有所进步,它调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待,它有个更严重的问题:
回到代码层面上来讲,我们看看客户端请求与服务端通讯的过程:

服务端与客户端每建立一个连接,都要为这个连接分配一套配套的资源,主要体现为系统内存资源,以PHP为例,维护一个连接可能需要20M的内存
这就是为什么一般并发量一大,就需要多开服务器
那么NodeJS是怎么解决这个问题的呢?
我们来看另外一个模型,想象一下我们在快餐店点餐吃饭的场景
(3)异步、事件驱动模型

我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,
拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。
等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)
这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),
这体现了NodeJS的显著特点,异步机制、事件驱动
整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接
基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量
虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心
总结一下NodeJS是怎么解决并发连接这个问题的:
更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,
而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)
2. I/O阻塞
NodeJS解决的另外一个问题是I/O阻塞,看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理
(1)串行获取数据,这是我们一般的解决方案,以PHP为例
假如获取profile和timeline操作各需要1S,那么串行获取就需要2S
(2)NodeJS非阻塞I/O,发射/监听事件来控制执行过程
NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,
因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,
两个动作并行执行,假如各需要1S,那么总的时间也就是1S
它们的I/O操作执行完成后,发射一个事件,profile和timeline,
事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点
总结一下:
Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然
三. NodeJS的优缺点
优点:
1. 高并发(最重要的优点)
2. 适合I/O密集型应用
缺点:
1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;
2. 只支持单核CPU,不能充分利用CPU
3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
原因:单进程,单线程
解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;
(2)开多个进程监听同一个端口,使用cluster模块;
4. 开源组件库质量参差不齐,更新快,向下不兼容
5. Debug不方便,错误没有stack trace
四. 适合NodeJS的场景
1. RESTful API
这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。
它本质上只是从某个数据库中查找一些值并将它们组成一个响应。
由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。
2. 统一Web应用的UI层
目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。

不讨论这种架构是好是坏,但是有另外一种实践,面向服务的架构,更好的做前后端的依赖分离。
如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。
那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面

3. 大量Ajax请求的应用
例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,
NodeJS能响应大量的并发请求
总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景
五. 结尾
其实NodeJS能实现几乎一切的应用
我们考虑的点只是适不适合用它来做
使用Node.js搭建静态资源服务器
作者:SheilaSun
原文地址:https://www.cnblogs.com/SheilaSun/p/7271883.html
问题汇总
npm 依赖下载报错:Hostname/IP does not match certificate's altnames: Host: registry.cnpmjs.org. is not in the cert's altnames: DNS:r.cnpmjs.org
npm set strict-ssl false npm config set registry http://registry.npmjs.org/
npm ERR! typeerror Error: Missing required argument #1
这种错误可能是由于 npm 版本引起的,可以尝试升级 npm 版本:


浙公网安备 33010602011771号