会js你就会node(一)开胃菜

Node.js是什么?

Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成, 目前官网最新版本已经更新到 12.0.0版本,最新稳定的是10.15.3。Node.js 不是一门语言也不是框架,它只是基于 Google V8 引擎的 JavaScript 运行时环境,同时结合 Libuv 扩展了 JavaScript 功能,使之支持 io、fs 等只有语言才有的特性,使得 JavaScript 能够同时具有 DOM 操作(浏览器)和 I/O、文件读写、操作数据库(服务器端)等能力,是目前最简单的全栈式语言。

这里我们可以简单理解Node.js是一个内置有chrome V8引擎的JavaScript运行环境,他可以使原本在浏览器中运行的JavaScript有能力跑后端,从而操作我们数据库,进行文件读写等。

目前市面上高密集的I/O模型,比如 Web 开发,微服务,前端构建等都有做Node.js的身影。不少大型网站都是使用 Node.js 作为后台开发语言的,比如 淘宝 双十一、去哪儿网 的 PC 端核心业务等。另外我们一些前端工具譬如VSCode,webpack等也是有Node.js开发。

Node.js的包管理工具,npm已经成为世界开源包管理中最大的生态,功能强大,目前单月使用者接近1000万。

Node.js特点(记住三句话)

事件驱动
非阻塞IO模型(异步)
轻量和高效

目前用途

用Node做后端,可能是大多数人认为的Node作用。其实真正在企业之中,很少会让你去用Node去做后端。 所以一般来说都是做一些小型或者个人站的后端。

第一个项目

  1. 首先安装node
    我们在官网下载即可 https://nodejs.org/en/
    打开终端使用node -v 查看自己的node版本
    在这里插入图片描述
  2. node 运行
    直接在当前文件的终端 使用 node xxx.js 即可运行

我们在开发的过程中,每次改完代码之后都必须重启服务器,显然这样的操作效率是比较低,这里给大家推荐个工具,nodemon,nodemon可以帮我们实时监听项目中代码的变化,并且自动重启服务,而且配置简单。

安装:npm install -g nodemon
使用nodemon运行项目,取代之前的node app.js。
nodemon [your app.js]

项目运行之后,nodemon会自动监听代码的改动,并且重新启动服务,大大增加我们开发效率。

nodemon常见配置
在命令行指定应用的端口号:nodemon ./server.js localhost 8080
查看帮助,帮助里面有很多选项都是一目了然:nodemon -h 或者 nodemon --help
运行 debug 模式:nodemon --debug ./server.js 80
手动重启项目: Nodemon 命令运行的终端 窗口中输入 rs 两个字符,然后再按下回车键,就能手动重启 Nodemon了。

拓展

模块化开发

Node.js采用的是CommonJs规范,在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。
在编写每个模块时,都有require、exports、module三个预先定义好的变量可供使用。

Node.js中模块的分类:

核心模块(已经封装好的内置模块);
自己定义的模块;
第三方的模块(npm下载下来的);

require
require函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法:let cc = require(“模块名”) ,其中模块名可以用绝对路径也可以用相对路径,模块的后缀名.js可以省略。例如:

let cc1 = require('./main.js')
let cc2 = require('home/src/main.js')
let cc3 = require('./main')

require()函数用两个作用:

执行导入的模块中的代码;
返回导入模块中的接口对象;
exports
exports对象用来导出当前模块的公共方法或属性,别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。用法:exports.name,name为导出的对象名。例子:

exports.add = function () {
  let i = 0
  console.log(++i)
}


导出一个add方法供其他模块使用
其实exports类似于ES6中的export的用法,用来导出一个指定名字的对象。

module.exports
module.exports用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过module.exports修改为导出一个函数。如下:

module.exports = function () {
  console.log('hello world!')
}

模块的初始化
一个模块中的JS代码仅在模块第一次被使用时执行一次,并且在使用的过程中进行初始化,之后缓存起来便于后续继续使用。

主模块
通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。例如通过以下命令启动程序时,main.js就是主模块。

$ node main.js // 运行main.js启动程序,main.js称为主模块

完整实例:

在项目中我们有个hello.js文件,里面定义了一个求和的函数

var a = 1;function add () {
  return ++a;
}

exports.add = add

我们在项目的主模块 main.js中引入hello.js

var add1 = require('./hello')
var add2 = require('./hello')
​
console.log(add1.add())
console.log(add2.add())

该程序运行的结果如下:

$ node main.js
2
3

我们可以看到hello.js并没有别引入两次而初始化两次,说明模块只会在执行的过程中被初始化一次。

Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用。

Node.js中只有模块作用域,默认两个模块之间的变量,方法互不冲突,互不影响,这样就导致一个问题,我们怎样使用加载进来的模块中的方法呢?这就需要在另外一个模块exports接口对象中挂载模块中公共的方法。

exports
我们在a.js中有以下代码:

let foo = 'hello'
function add (x, y) {
  return x+y
}
exports.add = add // 在接口对象中挂载公共的add方法
exports.foo = foo // 在接口对象中挂载foo属性
//此时,在b.js中如果需要使用add方法,只需引入a.js即可。b.js代码如下:let a = require('./a.js')  // a.js和b.js在同级目录下,注意:同级目录必须加“./”
​
console.log(a.add(20,30)) // 使用a.js中的add方法

最后我们看到的效果如下:

node演示
在这里插入图片描述

相反,如果我们没有在a.js exports接口对象中挂载add方法,那么这里就得不到结果。

module.exports
// 对于1中的例子,我们同样可以利用module.exports来写,只需把暴露的方式改成如下:

module.exports.add = add  
​
module.exports.foo = foo

最终得到的效果是一样的:

node演示
在这里插入图片描述

总结
Node中每个模块都有一个module对象,module对象中的有一个exports属性为一个接口对象,我们需要把模块之间公共的方法或属性挂载在这个接口对象中,方便其他的模块使用这些公共的方法或属性。
Node中每个模块的最后,都会return: module.exports。
Node中每个模块都会把module.exports指向的对象赋值给一个变量exports,也就是说:exports = module.exports
module.exports = XXX,表示当前模块导出一个单一成员,结果就是XXX
如果需要导出多个成员时必须使用exports.add = XXX; exports.foo = XXX;或者使用module.exports.add = XXX; module.export.foo = XXX;。

require

Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require(‘第三方包名’),究竟require方法加载第三方包的原理机制是什么,今天我们来探讨下。

require(‘第三方包名’)优先在加载该包的模块的同级目录node_modules中查找第三方包。
let template = require(‘art-template’) //加载第三方包
node演示

找到该第三方包中的package.json文件,并且找到里面的main属性对应的入口模块,该入口模块即为加载的第三方模块。

如果在要加载的第三方包中没有找到package.json文件或者是package.json文件中没有main属性,则默认加载第三方包中的index.js文件。

如果在加载第三方模块的文件的同级目录没有找到node_modules文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找node_modules文件夹,查找规则如上一致。

如果一直找到该模块的磁盘根路径都没有找到,则会报错:can not find module xxx。

只有了解清楚require()加载包的规则,才可以为以后的学习打下基础。

npm

npm英文全称:node package manager,npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 包(package) (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。 我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:

npm -v:查看npm版本。
npm init:初始化后会出现一个package.json配置文件。可以在后面加上-y ,快速跳过问答式界面。
npm install:会根据项目中的package.json文件自动下载项目所需的全部依赖。
npm install 包名 --save-dev(npm install 包名 -D):安装的包只用于开发环境,不用于生产环境,会出现在package.json文件中的devDependencies属性中。
npm install 包名 --save(npm install 包名 -S):安装的包需要发布到生产环境的,会出现在package.json文件中的dependencies属性中。
npm list:查看当前目录下已安装的node包。
npm list -g:查看全局已经安装过的node包。
npm --help:查看npm帮助命令。
npm update 包名:更新指定包。
npm uninstall 包名:卸载指定包。
npm config list:查看配置信息。
npm 指定命令 --help:查看指定命令的帮助。
npm info 指定包名:查看远程npm上指定包的所有版本信息。
npm config set registry https://registry.npm.taobao.org: 修改包下载源,此例修改为了淘宝镜像。
npm root:查看当前包的安装路径。
npm root -g:查看全局的包的安装路径。
npm ls 包名:查看本地安装的指定包及版本信息,没有显示empty。
npm ls 包名 -g:查看全局安装的指定包及版本信息,没有显示empty。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘴巴嘟嘟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值