# 简介
前端工程师需要学习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)
作者简介: 宫晨光,人和未来大数据前端工程师。