一.认识Node.js
Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP、Java、Python、.NET、Ruby等后端语言平起平坐。
Node.js是基于V8引擎,V8引擎是Google发布的开源JavaScript引擎,V8引擎被应用在Chrome、Nodejs和其他应用中。
1. Node.js的特性
(1) Nodejs语法完全是js语法,只要你懂js基础就可以学会Nodejs后端开发。
(2) Node.js超强的高并发能力,能够实现高性能服务器。
(3) 开发周期短、开发成本低、学习成本也低
2. 浏览器和Node.js环境对比
下图中,在左边Chrome浏览器环境中,V8引擎用于解析JS代码,而Blink引擎是浏览器的排版引擎,用于处理网页的html、css和DOM操作。
而右边的Node环境中,只有V8引擎,用于处理JS代码,所以Node.js中,访问DOM和BOM是无法实现的。但Node.js因为有libuv中间层加持,能够实现浏览器所不能实现的一些功能。
Node.js 可以解析JS代码(没有浏览器安全级别的限制)提供很多系统级别的API,例如(现在看不懂没关系):
文件的读写 (File System)
const fs = require('fs') fs.readFile('./test.txt', 'utf-8', (err, content) => { console.log(content) })
进程的管理 (Process)
function main(argv) { console.log(argv) } main(process.argv.slice(2))
网络通信 (HTTP/HTTPS)
const http = require("http") http.createServer((req,res) => { res.writeHead(200, { "content-type": "text/plain" }) res.write("hello nodejs") res.end() }).listen(3000)
3.开发环境安装和搭建
大家点击http://nodejs.cn/download/ 这个网址下载长期支持版的Node.js。
这个是国内的网站,大家不用担心进不去。同时也建议大家收藏Node.js中文网这个网站,还有Node.js的API文档
安装也没啥好说的,你只要下一步下一步就可以了。安装好后,在任意地方打开命令行窗口,运行node -v ,如果能打印出Node.js的版本号的话,则说明安装成功了。
二.commonJS、包以及npm
1. CommonJS规范
在node.js环境中,默认支持模块系统,该模块系统遵循CommonJs规范。
一个 JavaScript 文件就是一个模块,在模块文件中定义的变量和函数默认只能在模块文件内部使用,如果需要在其他文件中使用,必须显式声明将其进行导出。
CommonJS模块规范主要分为模块导出(也叫模块定义)、模块引用两个部分。
模块导出(module.exports或exports)
CommonJS中定义模块的规定:
我们把公共功能抽离成一个单独的js文件作为一个模块。默认情况下,里面的方法和属性是外面无法访问的。如果想要让外面能够访问到里面的属性和方法,就必须要通过 module.exports 或exports暴露属性和方法。
在每一个模块文件中,都会存在一个 module 对象,即模块对象。在模块对象中保存了和当前模块相关信息。
不信我们在test.js中编写如下代码:
console.log(module);
在当前目录下面的命令行中运行node .\test.js
,会打印如下的结果:
在模块对象中有一个属性 exports,它的值是一个对象,模块内部需要被导出的成员都应该存储在到这个对象中。
可以用module.exports
给test.js模块系统添加属性:
const url = "https://blog.csdn.net/"; function log(message){ console.log(message); } module.exports.endPoint = url; //给module下的exports添加url属性 module.exports.log = log; //给module下的exports添加log属性 console.log(module);
或者用exports给test.js模块系统添加属性:
const url = "https://blog.csdn.net/"; function log(message){ console.log(message); } exports.endPoint = url; //给module下的exports添加url属性 exports.log = log; //给module下的exports添加log属性 console.log(module);
或者用module.exports = { }
把属性组合成一个对象后导出:
const url = "https://blog.csdn.net/"; function log(message){ console.log(message); } module.exports = { url : url, log : log } console.log(module);
模块导入(require)
在其他文件中通过 require 方法引入模块,require 方法的返回值就是对应模块的 module.exports 对象。在导入模块时,模块文件后缀 .js 可以省略,文件路径不可省略。
(1) require 方法属于同步导入模块,模块导入后可以立即使用。
(2) 导入其他模块时,建议使用 const 关键字声明,防止模块被重置。
我们创建一个require.js文件,里面导入上面的test.js:
const test = require('./test') console.log(module);
会发现打印的第二个module的children属性会多一些信息:
2. npm包管理工具的用法详解
npm介绍:npm是世界上最大的开放源代码的生态系统,我们可以通过npm下载各种包。npm是随同Node.js一起安装的包管理工具,能解决Node.js代码部署上的很多问题。
常见的使用场景有以下几种
(1) 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
(2) 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
(3) 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
npm常用命令
初始化项目:
npm init --yes
使用 npm 命令安装模块:
npm install 包名@版本号
全局安装与本地安装:
npm install 包名 # 本地安装 npm install 包名 -g # 全局安装
查看所有全局安装的模块:
npm list -g
卸载模块:
npm uninstall 包名
更新模块:
npm update 包名
package.json 和 package-lock.json 区别
(1) package.json 是在运行 “ npm init ”时生成的,主要记录项目依赖,主要有以下结构:
name:项目名,也就是在使用npm init 初始化时取的名字.
main:入口文件,一般都是 index.js
description:描述信息,有助于搜索。
version:版本号。
keywords:关键字,有助于在人们使用 npm search搜索时发现你的项目。
scripts:支持的脚本,默认是一个空的 test。
license :默认是 MIT。
dependencies:指定了项目运行时(生产环境)所依赖的模块。
devDependencies:指定项目开发时所需要的模块,也就是在项目开发时才用得上,一旦项目打包上线了,就将移除这里的第三方模块。
(2) package-lock.json 是在运行 “npm install” 时生成的一个文件,用于记录当前状态下项目中实际安装的各个 package 的版本号、模块下载地址、及这个模块又依赖了哪些依赖。
为什么有了package.json,还需要 package-lock.json 文件呢?
当项目中已有 package-lock.json 文件,在安装项目依赖时,将以该文件为主进行解析安装指定版本依赖包,而不是使用 package.json 来解析和安装模块。
因为 package 只是指定的版本不够具体,而package-lock 为每个模块及其每个依赖项指定了安装的版本,位置和完整性哈希,所以它每次创建的安装都是相同的。
无论你使用什么设备,或者将来安装它都无关紧要,每次都应该给你相同的结果。
npm install安装模块时的一些选项
使用npm install安装依赖时,可以使用--save和--save-dev。
使用--save安装的依赖,安装的包会被写到package的dependencies属性里面去。dependencies 是运行时依赖(生产环境),可以简化为参数 -S。
而使用--save-dev 则添加到 package.json 文件 devDependencies 键下,devDependencies 是开发时的依赖。即 devDependencies 下列出的模块,是开发时用的 ,生产环境会移除,可以简化为参数 -D。
版本号的命名规则
在 Node.js 中所有的版本号都有3个数字:x.y.z。
第一个数字是主版本。第二个数字是次版本。第三个数字是补丁版本。
^:只会执行不更改最左边非零数字的更新。 如果写入的是 ^0.13.0,则当运行 npm update 时,可以更新到 0.13.1、0.13.2 等,但不能更新到 0.14.0 或更高版本。 如果写入的是 ^1.13.0,则当运行 npm update 时,可以更新到 1.13.1、1.14.0 等,但不能更新到 2.0.0 或更高版本。
~:如果写入的是 〜0.13.0,则当运行 npm update 时,会更新到补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
>:接受高于指定版本的任何版本。
>=:接受等于或高于指定版本的任何版本。
<=:接受等于或低于指定版本的任何版本。
<:接受低于指定版本的任何版本。
=:接受确切的版本。
-:接受一定范围的版本。例如:2.1.0 - 2.6.2。
||:组合集合。例如 < 2.1 || > 2.6。