参考一 Node入门 七天学会NodeJS Node.js v4.2.4 手册 & 文档 Node.js 教程 node.js摸石头系列 从零开始学习node.js What is npm? Node.js v4.4.7Documentationhtml
JS是脚本语言,脚本语言都须要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于须要独立运行的JS,NodeJS就是一个解析器。前端
每一种解析器都是一个运行环境,不但容许JS定义各类数据结构,进行各类计算,还容许JS使用运行环境提供的内置对象和方法作一些事情。例如运行在浏览器中的JS的用途是操做DOM,浏览器就提供了document
之类的内置对象。而运行在NodeJS中的JS的用途是操做磁盘文件或搭建HTTP服务器,NodeJS就相应提供了fs
、http
等内置对象。node
编写稍大一点的程序时通常都会将代码模块化。git
在NodeJS中,通常将代码合理拆分到不一样的JS文件中,每个文件就是一个模块,而文件路径就是模块名(文件名就是模块名)。程序员
在编写每一个模块时,都有require
、exports
、module
三个预先定义好的变量可供使用。github
require
函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。web
require方能看到的只有module.exports这个对象,它是看不到exports对象的,而咱们在编写模块时用到的exports对象实际上只是对module.exports的引用。算法
exports
对象是当前模块的导出对象,用于导出模块公有方法和属性。shell
别的模块经过require
函数使用当前模块时获得的就是当前模块的exports
对象npm
经过module
对象能够访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。
例如模块导出对象默认是一个普通对象,若是想改为一个函数的话,可使用如下方式。
module.exports = function () { console.log('Hello World!'); };
一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程当中初始化模块的导出对象。以后,缓存起来的导出对象被重复利用。
经过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工做。
有经验的C程序员在编写一个新程序时首先从make文件写起。一样的,使用NodeJS编写程序前,为了有个良好的开端,首先须要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架。
require
函数支持斜杠(/
)或盘符(C:
)开头的绝对路径,也支持./
开头的相对路径。但这两种路径在模块之间创建了强耦合关系。
require
函数支持第三种形式的路径,写法相似于foo/bar
,并依次按照如下规则解析路径,直到找到模块位置。
咱们已经知道了JS模块的基本单位模块是单个JS文件,但复杂些的模块每每由多个子模块组成。
为了便于管理和使用,咱们能够把由多个子模块组成的大模块称作包
,并把全部子模块放在同一个目录里。
在组成一个包的全部子模块中,须要有一个入口模块,入口模块的导出对象被做为包的导出对象。
当模块的文件名是index.js
,加载模块时可使用模块所在目录的路径代替模块文件路径
var cat = require('/home/user/lib/cat'); var cat = require('/home/user/lib/cat/index');
若是想自定义入口模块的文件名和存放位置,就须要在包目录下包含一个package.json
文件,并在其中指定入口模块的路径。
NodeJS会根据包目录下的package.json
找到入口模块所在位置
一个标准的工程目录都看起来像下边这样
- /home/user/workspace/node-echo/ # 工程目录 - bin/ # 存放命令行相关代码 node-echo + doc/ # 存放文档 - lib/ # 存放API相关代码 echo.js - node_modules/ # 存放三方包 + argv/ + tests/ # 存放测试用例 package.json # 元数据文件 README.md # 说明文件
NPM是随同NodeJS的包管理工具
下载好以后,argv
包就放在了工程目录下的node_modules
目录中,所以在代码中只须要经过require('argv')
的方式就好,无需指定三方包路径。
用户只需关心本身直接使用的三方包,不须要本身去解决全部包的依赖关系
第一次使用NPM发布代码前须要注册一个帐号
终端下运行npm adduser
,以后按照提示作便可。帐号搞定后,接着咱们须要编辑package.json
文件,加入NPM必需的字段。
{ "name": "node-echo", # 包名,在NPM服务器上需要保持惟一 "version": "1.0.0", # 当前版本号 "dependencies": { # 三方包依赖,须要指定包名和版本号 "argv": "0.0.2" }, "main": "./lib/echo.js", # 入口模块位置 "bin" : { "node-echo": "./bin/node-echo" # 命令行程序名和主模块位置 } }
以后,咱们就能够在package.json
所在目录下运行npm publish
发布代码了。
让前端以为如获神器的不是NodeJS能作网络编程,而是NodeJS可以操做文件。小至文件查找,大至代码编译,几乎没有一个前端工具不操做文件。换个角度讲,几乎也只须要一些数据处理逻辑,再加上一些文件操做,就可以编写出大多数前端工具。
使用NodeJS内置的fs
模块
上边的程序拷贝一些小文件没啥问题,但这种一次性把全部文件内容都读取到内存中后再一次性写入磁盘的方式不适合拷贝大文件,内存会爆仓。对于大文件,咱们只能读一点写一点,直到完成拷贝
buffer 缓冲/
JS语言自身只有字符串数据类型,没有二进制数据类型,所以NodeJS提供了一个与String
对等的全局构造函数Buffer
来提供对二进制数据的操做。
Buffer
与字符串有一个重要区别。字符串是只读的,而且对字符串的任何修改获得的都是一个新字符串,原字符串保持不变。至于Buffer
,更像是能够作指针操做的C语言数组
当内存中没法一次装下须要处理的数据时,或者一边读取一边处理更加高效时,咱们就须要用到数据流
NodeJS经过fs
内置模块提供对文件的操做。fs
模块提供的API基本上能够分为如下三类:
文件属性读写。
其中经常使用的有fs.stat
、fs.chmod
、fs.chown
等等。
文件内容读写。
其中经常使用的有fs.readFile
、fs.readdir
、fs.writeFile
、fs.mkdir
等等。
底层文件操做。
其中经常使用的有fs.open
、fs.read
、fs.write
、fs.close
等等。
基本上全部fs
模块API的回调参数都有两个。第一个参数在有错误发生时等于异常对象,第二个参数始终用于返回API方法执行结果。
操做文件时不免不与文件路径打交道。NodeJS提供了path
内置模块来简化路径相关操做,并提高代码可读性。
path.normalize
将传入的路径转换为标准路径,具体讲的话,除了解析路径中的.
与..
外,还能去掉多余的斜杠。
path.join
将传入的多个路径拼接为标准路径。该方法可避免手工拼接路径字符串的繁琐,而且能在不一样系统下正确使用相应的路径分隔符
path.extname
当咱们须要根据不一样文件扩展名作不一样操做时,该方法就显得很好用。
使用NodeJS编写前端工具时,操做得最多的是文本文件,所以也就涉及到了文件编码的处理问题。
咱们经常使用的文本编码有UTF8
和GBK
两种,而且UTF8
文件还可能带有BOM。
在读取不一样编码的文本文件时,须要将文件内容转换为JS使用的UTF8
编码字符串后才能正常处理。
'http'模块提供两种使用方式:
做为服务端使用时,建立一个HTTP服务器,监听HTTP客户端请求并返回响应。
做为客户端使用时,发起一个HTTP客户端请求,获取服务端响应。
https
模块与http
模块极为相似,区别在于https
模块须要额外处理SSL证书
处理HTTP请求时url
模块使用率超高,由于该模块容许解析URL、生成URL,以及拼接URL
querystring
模块用于实现URL参数字符串与参数对象的互相转换
zlib
模块提供了数据压缩和解压的功能。
当咱们处理HTTP请求和响应时,可能须要用到这个模块。
net
模块可用于建立Socket服务器或Socket客户端
NodeJS能够感知和控制自身进程的运行环境和状态,也能够建立子进程并与其协同工做,这使得NodeJS能够把多个程序组合在一块儿共同完成某项工做,并在其中充当胶水和调度器的做用。
咱们已经知道了NodeJS自带的fs
模块比较基础,把一个目录里的全部文件和子目录都拷贝到另外一个目录里须要写很多代码。
process
不是内置模块,而是一个全局对象
NodeJS最大的卖点——事件机制和异步IO,对开发者并非透明的。
在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
JS自己是单线程运行的,不可能在一段代码还未结束运行时去运行别的代码,所以也就不存在异步执行的概念。
可是,若是某个函数作的事情是建立一个别的线程或进程,并与JS主线程并行地作一些事情,并在事情作完后通知JS主线程,那状况又不同了。
NodeJS提供了domain
模块,能够简化异步代码的异常处理
在介绍该模块以前,咱们须要首先理解“域”的概念
node package manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。
Nodejs自身提供了基本的模块,可是开发实际应用过程当中仅仅依靠这些基本模块则还须要较多的工做。幸运的是,Nodejs库和框架为咱们提供了帮助,让咱们减小工做量。可是成百上千的库或者框架管理起来又很麻烦,有了NPM,能够很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。
If you've been working with Javascript for awhile, you might have heard of npm: npm makes it easy for Javascript developers to share the code that they've created to solve particular problems, and for other developers to reuse that code in their own applications.
Once you're depending on this code from other developers, npm makes it really easy to check to see if they've made any updates to it, and to download those updates when they're made.(能够检测所依赖的代码块是否有更新)
These bits of reusable code are called packages, or sometimes modules. A package is just a directory with one or more files in it, that also has a filed called "package.json" with some meta data about this package.
A typical application, such as a website, will depend on dozens or hundreds of packages. These packages are often small. The general idea is that you create a small building block which solves one problem and solves it well. This makes it possible for you to compose larger, custom solutions out of these small, shared building blocks.
So now that you have an idea of what npm can do, let's talk about how it works. When people talk about npm, they can be talking about one of three things. They could be talking about the website, which we've just been looking at. Or they could be talking about the registry, which is a big database of information about packages that people are sharing. Or the third thing they could be talking about is the client: when a developer decides to share their code, they use the npm client which is installed on their computer to publish that code up to the registry. And once there's an entry for this package in the registry, then other developers can use their npm clients to install the package from the registry. The entry in the registry for this package is also reflected on the website, where there's a page dedicated to this new package.(人们讨论npm,是在讨论三件事中的一件,一是本网站(官网),二是仓库(或是代码库),三是客户端上的行为)
So that's what npm is. It's a way to reuse code from other developers, and also a way to share your code with them, and it makes it easy to manage the different versions of code.
Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,相似 Window 系统的终端或 Unix/Linux shell,咱们能够在终端中输入命令,并接收系统的响应。
Node 自带了交互式解释器,能够执行如下任务:
读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
执行 - 执行输入的数据结构
打印 - 输出结果
循环 - 循环操做以上步骤直到用户两次按下 ctrl-c 按钮退出。
这是一个完整 npmjs.org
镜像站,你能够用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽可能与官方服务同步
安装模块
cnpm install [name]