简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。
Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。
Node.js® is an open-source, cross-platform JavaScript runtime environment.
Node.js
Javascript与Nodejs
Node.js 不是一门编程语言,它是一个执行 JavaScript 代码的工具。工具是指可以安装在计算机操作系统之上的软件。
为什么浏览器和 Node.js 都可以运行 JavaScript?
因为浏览器和 Node.js 都内置了 JavaScript V8 Engine。
它可以将 JavaScript 代码编译为计算机能够识别的机器码。
浏览器中运行的 JavaScript 和 Node.js 中运行的 JavaScript 有区别吗?
在内置了 JavaScript V8 Engine 以后实际上只能执行 ECMAScript,就是语言中的语法部分。
浏览器为了能够让 JavaScript 操作浏览器窗口以及 HTML 文档,所以在 JavaScript V8 Engine 中添加了控制它们的 API, 就是 DOM 和 BOM. 所以 JavaScript 在浏览器中运行时是可以控制浏览器窗口对象和DOM文档对象的。
和浏览器不同,在 Node.js 中是没有 DOM 和 BOM 的,所以在 Node.js 中不能执行和它们相关的代码,比如 window.alert()
或者 document.getElementById()
。DOM 和 BOM 是浏览器环境中特有的。在 Node.js 中,作者向其中添加了很多系统级别的 API,比如对操作系统中的文件和文件夹进行操作。获取操作系统信息,比如系统内存总量是多少,系统临时目录在哪,对系统的进程进行操作等等。
- JavaScript 运行在浏览器中控制的是浏览器窗口和 DOM 文档。
- JavaScript 运行在 Node.js 中控制的操作系统级别的内容。
为什么浏览器中的 JavaScript 不能控制系统级别的 API ?
浏览器是运行在用户的操作系统中的,如果能控控制系统级别的 API 就会存在安全问题。 (当用户去访问一个网站的时候,这个网站上的javascript代码绝对不会控制你的电脑,不会在你电脑上新增文件或者修改删除文件。除了控制浏览器之外,不会也不能够调用系统的API,否则你就会在不知情的情况下电脑被攻击了,例如windows上的exe程序是能够系统级别的API的,所以如果在下载exe程序的时候,通常会给出警告信息)。
Node.js 是运行在远程的服务器中的,访问的是服务器系统 API,不存在这方面的安全问题。 (因为这部分代码是服务器需要运行的,如果不能使用系统级别的API。那他与浏览器中的javascript有什么区别,而且这些代码不是交给客户的浏览器使用,不会威胁到客户的机器,仅仅是在服务器上运行,起到提供服务的功能,不与客户产生直接交互)
一个是基于浏览器端的 javascript (前端 JS),一个是基于服务端的 javascript (后端 Node.js)
- 语法一样
- 组成不一样
JavaScript:
- ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象)
- DOM(一些操作页面元素的方法)
- BOM(一些操作浏览器的方法)
Node.js:
- ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象)
- OS(操作系统)
- file(文件系统)
- net(网络系统)
- database(数据库)
下载
在Node.js下载,然后安装即可
Hello World
代码
1 | console.log("hello world"); |
运行
1 | node helloworld.js |
引入模块
1 | const module = require('module-name'); |
其中,module-name 可以是一个文件路径(相对或绝对路径),也可以是一个模块名称,如果是一个模块名称,Node.js 会自动从 node_modules 目录中查找该模块。
require 指令会返回被加载的模块的导出对象,可以通过该对象来访问模块中定义的属性和方法,如果模块中有多个导出对象,则可以使用解构赋值的方式来获取它们。
我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:
1 | var http = require("http") |
NPM
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 “npm -v” 来测试是否成功安装。命令如下,出现版本提示表示安装成功:
1 | npm -v |
安装模块
1 | npm install <Module Name> |
例如
1 | npm install express |
安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require(‘express’) 的方式就好,无需指定第三方包路径。
1 | var express = require('express'); |
全局安装与本地安装
pm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如
1 | npm install express # 本地安装 |
本地安装
将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
可以通过 require() 来引入本地安装的包。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link
查看安装信息
你可以使用以下命令来查看所有全局安装的模块:
1 | npm list -g |
如果要查看某个模块的版本号,可以使用命令如下(查看全局需要加 -g
):
1 | npm list grunt |
package.json
1 | { |
- name - 包名。
- version - 包的版本号。
- description - 包的描述。
- homepage - 包的官网 url 。
- author - 包的作者姓名。
- contributors - 包的其他贡献者姓名。
- dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
- repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
- main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
- keywords - 关键字
卸载模块
我们可以使用以下命令来卸载 Node.js 模块。
1 | npm uninstall express |
卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:
1 | npm ls |
更新模块
1 | npm update express |
搜索模块
1 | npm search express |
创建模块
创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。
1 | npm init |
示例
1 | npm init |
以上的信息,你需要根据你自己的情况输入。在最后输入 “yes” 后会生成 package.json 文件。
接下来我们可以使用以下命令在 npm 资源库中注册用户(使用邮箱注册):
1 | npm adduser |
接下来我们就用以下命令来发布模块:
1 | npm publish |
如果你以上的步骤都操作正确,你就可以跟其他模块一样使用 npm 来安装。
文件操作
读取
文件 test.txt
1 | www.suneshone.com |
代码 demo.js
1 | var fs = require("fs"); |
执行结果
1 | node demo.js |
打开文件
1 | fs.open(path, flags[, mode], callback) |
参数:
- path 文件路径
- flags 文件打开行为
- mode 设置文件模式(权限),文件创建默认权限为0666(可读,可写)
- callback 回调函数,带有两个参数
callback(err,fd)
flags 参数值
Flag | 描述 |
---|---|
r | 以读取模式打开文件。如果文件不存在抛出异常。 |
r+ | 以读写模式打开文件。如果文件不存在抛出异常。 |
rs | 以同步的方式读取文件。 |
rs+ | 以同步的方式读取和写入文件。 |
w | 以写入模式打开文件,如果文件不存在则创建。 |
wx | 类似 ‘w’,但是如果文件路径存在,则文件写入失败。 |
w+ | 以读写模式打开文件,如果文件不存在则创建。 |
wx+ | 类似 ‘w+’, 但是如果文件路径存在,则文件读写失败。 |
a | 以追加模式打开文件,如果文件不存在则创建。 |
ax | 类似 ‘a’, 但是如果文件路径存在,则文件追加失败。 |
a+ | 以读取追加模式打开文件,如果文件不存在则创建。 |
ax+ | 类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。 |