# 简介

前端工程师需要学习nodejs来扩充自己的知识边界,也让自己更方便的理解webpack,前端工程化等。

# 1. process

process对象是node中的一个全局变量,它提供了nodejs进程的信息并对其进行控制,作为全局变量,process始终可以直接使用。

argv是我们常会见到一个属性,process.argv返回一个数组,包含了在运行node代码时命令行中输入的值。举个例子假如我们运行一段node代码,并在命令行中添加一些参数:$ node app.js xiaoming 2,那么process.argv的值即为['node', '/path/to/your/app.js', 'xiaoming', 2]

这个属性值还是比较常见的,在vue-cli2中的webpack配置中就使用到了。根据后面的参数来判断当前是启动的是开发还是打包、测试等环境,来加载不同的webpack配置。有兴趣的可以自行vue的webpack配置代码中去查看。

# 2. fs文件系统

node作为后端程序,i/o处理能力自然是其核心能力之一。fs模块提供了一个可以与文件系统进行交互的api,所有的文件操作都同时具有同步和异步两种方式。使用时需要先引入fs模块const fs = require('fs');

# 2.1 readFile和readFileSync

fs.readFile('/path/to/file/',()=>{})fs.readFileSync('/path/to/file/'),分别是fs操作文件系统的异步(不阻塞)和同步(阻塞)两种方法。node中只要是以sync结尾的方法皆为同步(阻塞)操作。

用法简介:

const fs =  require('fs');

// 1.异步读取文件,读取的数据在其回调函数中
fs.readFile('/path/to/file', (err, res) => {
  const result = '';
  // res表示异步读取文件内容,默认是buffer格式
  // 对获取res文件添加状态监听
  res.on('data',(data) => {
    result += data;
  });
  // 监听res的end状态,表示文件读取完毕了
  res.on('end', () => {
    // 此时的result表示获取的全部文件内容
  });
})

// 2.同步读取文件
const data = fs.readFileSync('/path/to/file/');

我们可以看到,获取文件内容时,默认是一种buffer格式,这个格式是node中为了处理tcp流和文件系统操作中的二进制数据而引入的api。

# 2.2 readdir和readdirSync

这两个函数的使用方法和readFile、readFileSync相似,读取一个文件路径,返回的是一个相应文件目录下的文件名称的数组。使用方法分别为fs.readdir('/filePath',(err, list)=>{ });const list = fs.readdirSync('/filePath');

# 3.模块化module.exports和require

上面我们看到,在node中如何想使用其他模块,方式是使用require引入。其实在node中,我们也可以开发自己的模块并引入使用。

示例代码:

// module.js
module.exports = function(args) {
  // 这里开发自己模块的逻辑
}

// your program
const myModule = require('module.js');
...

在开发自己模块的时候有几个原则:

1.导出一个函数,这个函数可以准确接受自己所需要的参数

2.模块程序不要改变其他任何东西,比如全局变量

3.不要在模块中做任何输出,应该将处理的结果返回出去由使用的程序处理

4.如果自己的模块是个异步操作,则接受的参数中需要有回调函数callback

5.当有错误发生,或者有数据的时候使用回调函数进行处理

6.回调函数需按照node习惯,err错误处理作为函数的第一个参数function callback(err, data){}

# 4. http模块

http模块是node最重要的核心功能之一,可以用来处理http请求和生成一个简单的http服务。先来看一下使用http模块的几个简单应用场景。

// 引入
const http = require('http');

// 1.发起一个简单的http请求
http.get('/url', function(err, res){
  // res参数是node中的stream类型对象
  // 可以理解成会触发一些事件的对象
  res.on('data', function(data){
    // 对res进行监听,获取到的data是buffer对象
  });
  res.on('end', function() {

  });
});

// 2.生成一个本地的server,端口为3000
const  server = http.createServer(function(req, res) {
// req表示请求,res表示响应
});
server.listen(3000);

# 参考文章

learnyounode官网 (opens new window)

node中文官网 (opens new window)


作者简介: 宫晨光,人和未来大数据前端工程师。