nodejs入门

300 阅读5分钟

Hello World


const http = require('http')

const hostname = '127.0.0.1'

const port = 8091

const server = http.createServer((req, res) => {
    res.statusCode = 200
    res.setHeader('Content-Type', 'text/plain')
    res.end('hello, world\n')
})

server.listen(port, hostname, () => {
    console.log(`server start at ${hostname}:${port}`)
})

浏览器访问:http://localhost:8091/

image.png

基础知识

需要了解的js基础概念

  • 词汇结构
  • 表达式
  • 数据类型
  • 变量
  • 函数
  • this
  • 箭头函数
  • 循环
  • 作用域
  • 数组
  • 模板字面量
  • 分号
  • 严格模式
  • ECMAScript 6、2016、2017

理解nodejs异步编程的关键概念

  • 异步编程与回调
  • 定时器
  • Promise
  • Async 与 Await
  • 闭包
  • 事件循环

nodejs与命令行交互

nodejs从命令行接收参数

输入:

# 实例1
node main.js

# 实例2
node main.js 1

# 实例3
node main.js 1 name=zhangsan

获取参数值的方法是使用 Node.js 中内置的 process 对象

它公开了 argv 属性,该属性是一个包含所有命令行调用参数的数组。

第一个参数是 node 命令的完整路径。

第二个参数是正被执行的文件的完整路径。

所有其他的参数从第三个位置开始。

可以使用循环迭代所有的参数(包括 node 路径和文件路径):

process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`)
  })

image.png

也可以通过创建一个排除了前两个参数的新数组来仅获取其他的参数:

const args = process.argv.slice(2)
console.group(args[0])
console.group(args[1])

image.png

nodejs输出到命令行

使用控制台模块的基础输出 console.log

const cat = '猫'
console.log('我的%s已经%d岁', cat, 2)

image.png

  • %s 会格式化变量为字符串
  • %d 会格式化变量为数字
  • %i 会格式化变量为其整数部分
  • %o 会格式化变量为对象

清空控制台

console.clear() 会清除控制台(其行为可能取决于所使用的控制台)。

元素计数

console.count() 是一个便利的方法。

count 方法会对打印的字符串的次数进行计数,并在其旁边打印计数:

const x = 1
const y = 2
const z = 3
console.count(
  'x 的值为 ' + x + ' 且已经检查了几次?'
)
console.count(
  'x 的值为 ' + x + ' 且已经检查了几次?'
)
console.count(
  'y 的值为 ' + y + ' 且已经检查了几次?'
)

image.png

打印堆栈console.trace()

const function2 = () => console.trace()
const function1 = () => function2()
function1()

image.png

计算耗时time()和timeEnd()

const doSomething = () => console.log('测试')
const measureDoingSomething = () => {
  console.time('doSomething()')
  //做点事,并测量所需的时间。
  doSomething()
  console.timeEnd('doSomething()')
}
measureDoingSomething()

image.png

输出着色

console.log('\x1b[33m%s\x1b[0m', '你好')

image.png

Chalk 是一个对输出着色封装的库,除了为其着色外,它还有助于其他样式的设置(例如使文本变为粗体、斜体或带下划线)。

可以使用 npm install chalk 进行安装,然后就可以使用它:

const chalk = require('chalk')
console.log(chalk.yellow('你好'))

创建进度条

Progress 是一个很棒的软件包,可在控制台中创建进度条。 使用 npm install progress 进行安装。

以下代码段会创建一个 10 步的进度条,每 100 毫秒完成一步。 当进度条结束时,则清除定时器:

const ProgressBar = require('progress')


const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
  bar.tick()
  if (bar.complete) {
    clearInterval(timer)
  }
}, 100)

nojsjs从命令行接收输入

从版本 7 开始,Node.js 提供了 readline 模块来执行以下操作:每次一行地从可读流(例如 process.stdin 流,在 Node.js 程序执行期间该流就是终端输入)获取输入。

const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
  })
  
  readline.question(`你叫什么名字?`, name => {
    console.log(`你好 ${name}!`)
    readline.close()
  })

image.png

question() 方法会显示第一个参数(即问题),并等待用户的输入。 当按下回车键时,则它会调用回调函数。

在此回调函数中,关闭了 readline 接口。

Inquirer.js 软件包则提供了更完整、更抽象的解决方案。

可以使用 npm install inquirer 进行安装,然后复用上面的代码如下:

const inquirer = require('inquirer')

var questions = [
  {
    type: 'input',
    name: 'name',
    message: "你叫什么名字?"
  }
]

inquirer.prompt(questions).then(answers => {
  console.log(`你好 ${answers['name']}!`)
})

image.png

Inquirer.js 可以执行许多操作,例如询问多项选择、展示单选按钮、确认等。

使用exports从nodejs文件中公开功能

Node.js 具有内置的模块系统。

Node.js 文件可以导入其他 Node.js 文件公开的功能。

当想要导入某些东西时,使用

const library = require('./library')

可以导入存在于当前文件夹中的 library.js 文件中公开的功能。

在此文件中,必须先公开功能,然后其他文件才能将其导入。

默认情况下,文件中定义的任何其他对象或变量都是私有的,不会公开给外界。

这就是 module 系统提供的 module.exports API 可以做的事。

当将对象或函数赋值为新的 exports 属性时,这就是要被公开的内容,因此,可以将其导入应用程序的其他部分或其他应用程序中。

可以通过两种方式进行操作。

第一种方式是将对象赋值给 module.exports(这是模块系统提供的对象),这会使文件只导出该对象:

const car = {
  brand: 'Ford',
  model: 'Fiesta'
}


module.exports = car


//在另一个文件中


const car = require('./car')

第二种方式是将要导出的对象添加为 exports 的属性。这种方式可以导出多个对象、函数或数据:

const car = {
  brand: 'Ford',
  model: 'Fiesta'
}


exports.car = car

或者

exports.car = {
  brand: 'Ford',
  model: 'Fiesta'
}

在另一个文件中,则通过引用导入的属性来使用它:

const items = require('./items')
items.car

module.exports 和 export 之间有什么区别?

前者公开了它指向的对象。 后者公开了它指向的对象的属性。

package.json解析

它的结构是一个json,可以为空

它还可以有一些默认的属性:

  • author 列出软件包的作者名称。
  • contributors除作者外,该项目可以有一个或多个贡献者。 此属性是列出他们的数组。
  • bugs 链接到软件包的问题跟踪器,最常用的是 GitHub 的 issues 页面。
  • homepage 设置软件包的主页。
  • version 表明了当前的版本。格式:x.x.x, 第一个数字是主版本号,第二个数字是次版本号,第三个数字是补丁版本号。
  • name 设置了应用程序/软件包的名称。
  • description 是应用程序/软件包的简短描述。
  • repository 此属性指定了此程序包仓库所在的位置。
  • main 设置了应用程序的入口点。当在应用程序中导入此软件包时,应用程序会在该位置搜索模块的导出。
  • private 如果设置为 true,则可以防止应用程序/软件包被意外地发布到 npm
  • scripts 定义了一组可以运行的 node 脚本。
  • dependencies 设置了作为依赖安装的 npm 软件包的列表。
  • devDependencies 设置了作为开发依赖安装的 npm 软件包的列表。
  • engines 设置了此软件包/应用程序在哪个版本的 Node.js 上运行。
  • browserslist 用于告知要支持哪些浏览器(及其版本)。

参考

【1】Node.js 简介