node.js命令 如何运行nodejs环境
大家好,今天我将向大家分享有关node.js命令和如何运行nodejs环境的一些独特见解,希望能够为你们带来新的思考和启示。
如何基于nodejs开发一个命令行工具
效果预览实践
通过上面的gif演示,其实你已经读完了本文的所有内容:开发一个npm包,可以让所有人通过npm install命令安装,并且通过命令行直接运行相关指令,处理相应的事务。接下来我们就通过一个跟“Hello world”一样简单的示例,一起来学习。
包目录结构“无规矩,不成方圆”,任何事物都有其必须遵守的规则。开发一个Npm包,最基本的原则就是需要一个包目录,并创建相应的包配置文件。如示例所示:我们开发了一个名为zwj的包,那么我们就把包目录定义为zwj,接着便可以进入zwj目录,创建名为package.json的包配置文件。命令如下:
mkdirzwj
cdzwj
然而,当我们创建配置文件的时候,为了确保内容与格式的准确性,建议使用npm内置的npm init命令来创建。执行命令后,根据提示一步一步完成操作即可。当然,如果你非要自己一项一项配置去敲,也不会有人拦着你。
初始化的package.json文件,可以满足我们开发普通包的所有需求,但是对于需要支持命令行操作的包,我们还需要做一些其他的补充。首先,需要在配置文件中增加bin配置,并绑定命令和脚本。而脚本对应的文件位置,可以是包的根目录,也可以是包中其他任意目录下的文件。参考了几个较为有名的npm包,建议将脚本位置放置在名为bin的目录中。
完成了这些之后,当然我们就该考虑实现我们的小工具的具体功能了,所以少不了要创建一些js文件。至此,我们的包目录结构至少应该像下面这样:
有了前面的基础,接下来我们来逐个分析每个文件的内容,更加深入的去理解前面罗列信息。我们先来看一下配置文件的关键内容:
这是截取自package.json中的一部分,也是比较关键的一部分,这几个信息几乎是每个完整的npm包必填的配置。从上至下依次表示:包名、版本、包描述、主入口文件、bin【命令行不可少的配置字段】。
然后,我们看下示例中bin/zwj文件中的内容:
#!/usr/bin/envnode
require('../zwj.js');
代码超级简单,总共就这么两行。当然我们也可以在这里书写复杂的逻辑,比如根据命令行参数,调用不同的执行脚本等等。简单解释下这两行代码,第一行是Unix/Linux的写法,简单的说就是告诉程序使用什么东西来解释下面的代码,此处就是告诉系统使用node来执行下面的代码。第二行就简单了,执行加载../zwj.js模块,并返回。也就是说,经过这行代码之后,我们的命令行小工具的具体功能就可以交给zwj.js这个文件去控制了。那么,zwj.js究竟做什么,那这个就要看开发者的意图了,先不管这个,我们先来看看示例代码中的zwj.js做了什么:
varfs=require('fs'),
pwd=process.cwd();
console.log(fs.readdirSync(pwd));
如演示中所示,示例命令行工具的功能便是在控制台显示执行命令目录下的文件列表。process.cwd()得到的是当前执行命令目录的完整路径。
本地调试至此,用Node.js开发一个命令行工具的内容就讲完了。但是程序开发往往不能一步到位,期间可能存在各种各样未知的不可预测的问题。这时候调试就显得尤为重要了,这也是为什么调试环节在任何一个程序开发项目中不可或缺的原因之一。在Windows下开发命令行工具的测试方式其实很方便,进入本地包根目录,执行:
npminstall.-g
即可将本地正在开发的包,安装为全局包。而在执行以上命令的过程中,便会在npm全局包目录中生成命令行所需的cmd文件,本例生成zwj.cmd。生成的文件内容大致如下:
而在Unix/Linux中就更简单了,只需在包根目录执行npm link即可。
成功之后,我们就可以直接在命令行输入zwj命令,执行相应的功能了。当然,前提是npm全局包目录被添加到了path环境变量中。通常应该是这样的:
而当我们执行命令测试脚本发现问题后,我们在本地包中修改,完成后再次执行前面的安装代码便可以直接覆盖前一次安装,也可以先执行卸载命令:
npmuninstall-gzwj
然后再安装即可。
发布与升级当我们的工具开发完成后,如何发布到社区,如何提供给其他开发者使用,这是我们的最后一步。npm包的发布很简单,原本只需要在包根目录执行:npm publish命令即可。但如果你是第一次发布应用,需要解决好账号登录的问题:先执行npm adduser命令,依次输入用户名、密码和邮箱登录,然后通过npm whoami命令确认登录是否成功。万事俱备之后,再执行npm publish命令,你的包就可以发布到社区与众多开发者共享了!
最后,升级就简单了。本地增加好新的功能,测试通过之后,修改版本号之后,执行:npm publish等待完成即可。
PS:最好给每个包都增加一个README.md文件,写入包的作用,使用方法,更新日志等等。方便使用者查阅。完美~~
node.js 基础操作
require函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法: let cc= require("模块名"),其中模块名可以用绝对路径也可以用相对路径,模块的后缀名.js可以省略。例如:
require()函数用两个作用:
exports对象用来导出当前模块的公共方法或属性,别的模块通过 require函数使用当前模块时得到的就是当前模块的 exports对象。用法: exports.name,name为导出的对象名。例子:
module.exports用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过module.exports修改为导出一个函数。如下:
3.加载第三方包
Node.js中使用 CommonJs模块化机制,通过 npm下载的第三方包,我们在项目中引入第三方包都是: let xx= require('第三方包名'),究竟 require方法加载第三方包的原理机制是什么,今天我们来探讨下。
require('第三方包名')优先在加载该包的模块的同级目录 node_modules中查找第三方包。
找到该第三方包中的 package.json文件,并且找到里面的 main属性对应的入口模块,该入口模块即为加载的第三方模块。
如果在要加载的第三方包中没有找到 package.json文件或者是 package.json文件中没有 main属性,则默认加载第三方包中的 index.js文件。
如果在加载第三方模块的文件的同级目录没有找到 node_modules文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找 node_modules文件夹,查找规则如上一致。
如果一直找到该模块的磁盘根路径都没有找到,则会报错: can not find module xxx。
4.npm命令
npm英文全称: node package manager,npm为你和你的团队打开了连接整个 JavaScript天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30亿次的下载量,包含超过 600000个包(package)(即,代码模块)。来自各大洲的开源软件开发者使用 npm互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:
5.文件读取
var fs= require('fs')
同步:
var content= fs.readFileSync('hello.txt',{flag:'r',encoding:"utf-8"})
异步(默认):
flag:读取模式
encoding:编码格式
7.文件写入
var fs= require('fs')
格式:write=>w read=>r append=>a
异步:
8.文件删除
fs. unlink('lc.txt', function(){
9.buffer缓冲区
1、数组不能进行二进制数据的操作2、js数组不像java、python等语言效率高3、buffer内存空间开辟出固定大小的内存
let buf1= Buffer.alloc(10)
console.log(buf1)
allocUnsafe(之前的一些内容)(效率高)
10.文件目录
var fs= require('fs')
fs.readdir(path,callback)
导入 readline包
let readline= require('readline');
实例化接口对象(process对象,stdout/in输入输出)
question方法提问
close事件监听
11.文件流
var fs= require('fs')
语法: fs.createWriteStream(文件路径,【可选的配置操作】)
let ws= fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
let ws= fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
实践
fs.createReadStream(路径,【可选的配置项】)
文档
let rs= fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"})
音乐
let rs= fs.createReadStream('snake.mp4',{flags:'r'})
读取时写入
let ws= fs.createWriteStream('a.txt',{flags:"w",encoding:"utf-8"})
createReadStream.pipe(createWriteStream)
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
接下来我们就是用管道和链式来压缩和解压文件。
创建 compress.js文件,代码如下:
代码执行结果如下:
执行完以上操作后,我们可以看到当前目录下生成了 input.txt的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js文件,代码如下:
12.node事件
Node.js是单进程单线程应用程序,但是因为 V8引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js几乎每一个 API都是支持回调函数的。
Node.js基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
没有使用 events包仅使用JavaScript事件监听进行事件驱动
Node.js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
Node.js有多个内置的事件,我们可以通过引入 events模块,并通过实例化 EventEmitter类来绑定和监听事件,如下实例:
以下程序绑定事件处理程序:
我们可以通过程序触发事件:
接下来让我们执行以上代码:
在 Node应用程序中,执行异步操作的函数将回调函数作为最后一个参数,回调函数接收错误对象作为第一个参数。
接下来让我们来重新看下前面的实例,创建一个 input.txt,文件内容如下:
创建 main.js文件,代码如下:
以上程序中 fs.readFile()是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err对象就会输出错误信息。
如果没发生错误,readFile跳过 err对象的输出,文件内容就通过回调函数输出。
执行以上代码,执行结果如下:
接下来我们删除 input.txt文件,执行结果如下所示:
因为文件 input.txt不存在,所以输出了错误信息。
Node.js所有的异步 I/O操作在完成时都会发送一个事件到事件队列。
Node.js里面的许多对象都会分发事件:一个 net.Server对象会在每次有新连接时触发一个事件,一个 fs.readStream对象会在文件被打开的时候触发一个事件。所有这些产生事件的对象都是 events.EventEmitter的实例。
events模块只提供了一个对象:events.EventEmitter。EventEmitter的核心就是事件触发与事件监听器功能的封装。
你可以通过require("events");来访问该模块。
EventEmitter对象如果在实例化时发生错误,会触发 error事件。当添加新的监听器时,newListener事件会触发,当监听器被移除时,removeListener事件被触发。
下面我们用一个简单的例子说明 EventEmitter的用法:
执行结果如下:
运行这段代码,1秒后控制台输出了'some_event事件触发'。其原理是 event对象注册了事件 some_event的一个监听器,然后我们通过 setTimeout在 1000毫秒以后向 event对象发送事件 some_event,此时会调用some_event的监听器。
EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:
执行以上代码,运行的结果如下:
以上例子中,emitter为事件 someEvent注册了两个事件监听器,然后触发了 someEvent事件。
运行结果中可以看到两个事件监听器回调函数被先后调用。这就是EventEmitter最简单的用法。
EventEmitter提供了多个属性,如 on和 emit。 on函数用于绑定事件函数, emit属性用于触发一个事件。接下来我们来具体看下 EventEmitter的属性介绍。
如何运行nodejs环境
Window上安装Node.js
你可以采用以下两种方式来安装。
1、Windows安装包(.msi)
32位安装包下载地址:https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.msi
64位安装包下载地址:https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi
本文实例以 v0.10.26版本为例,其他版本类似,安装步骤:
步骤 1:双击下载后的安装包v0.10.26,如下所示:
和平时安装其他软件一样等待安装完成!
步骤 2:检测PATH环境变量是否配置了Node.js,点击开始=》运行=》输入"cmd"=>输入命令"path",输出如下结果:
PATH=C:\oraclexe\app\oracle\product\10.2.0\server\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;
c:\python32\python;C:\MinGW\bin;C:\Program Files\GTK2-Runtime\lib;C:\Program Files\MySQL\MySQL Server 5.5\bin;C:\Program Files\nodejs\;
C:\Users\rg\AppData\Roaming\npm
我们可以看到环境变量中已经包含了C:\Program Files\nodejs\
步骤 3:检查Node.js版本
2、Windows二进制文件(.exe)安装
32位安装包下载地址:http://nodejs.org/dist/v0.10.26/node.exe
64位安装包下载地址:http://nodejs.org/dist/v0.10.26/x64/node.exe
安装步骤
步骤 1:双击下载的安装包 Node.exe,将出现如下界面:
步骤 2:点击 Run(运行)按钮将出现命令行窗口:
步骤 3:版本测试
进入 node.exe所在的目录,如下所示:
如果你获得以上输出结果,说明你已经成功安装了Node.js。
好了,关于node.js命令和如何运行nodejs环境的问题到这里结束啦,希望可以解决您的问题哈!