NodeJs-新手角度看node

99 阅读4分钟

问题提及(node--js执行环境;node功能;模块化;)

1.为什么js可以在浏览器中执行

浏览器有专门解析jacascript的引擎 Chrome中是V8(性能最好)、IE(查克拉)通过对解析引擎的了解,学会如何更好的使用javascript;node也适用v8解析引擎,也用来运行js。

2.为什么javascript可以操作DOM和BOM

浏览器引擎(如V8)中集成了web API DOM API、BOM API、Ajax API(XMLHttpRequest) 、JS内置对象。 node.js无法调用DOM、BOM的API,那些是在浏览器运行环境中的API

3.javascript能不能做后端?

可以,需借助node.js(javascript的后端运行环境===》),内核为v8解析引擎+libuv(高性能异步io库)+http-parser处理网络报文的库

4.node.js可以做什么

基于Express框架,可以构建Web应用

基于Electron框架,可以构建桌面应用

基于restify框架,可以构建API接口项目

读写数据库、创建实用的命令行工具辅助前端开发

---提升前端程序员的竞争力

5.对照javascript学习路径:

javascript基础语法+浏览器内置API+第三方库jQuery、art-template

nodejs学习路径

javascript基础语法+nodejs内置API+第三方API模块

nodejs版本

LTS长期稳定版,推荐在企业级项目中使用

current新鲜尝鲜版(新特性测试版)

node命令行,及常用工具 安装nodemon,第三方工具(服务项目中的源代码改变自动重启服务器) ===》yarn 常见问题及处理

模块化

模块化的好处: 可复用性、可维护性、按需加载

模块化规范: 降低团队间的沟通成本

模块分类: 内置模块、自定义模块、第三方模块(下载使用)

加载模块:

const fs=require('fs')---内置模块

const cust = require('./custom.js') //自定义模块需要加路径,可省略后缀名,加载模块会直接执行其中的方法 cust获得module.exports对象,默认为{} //注意自定义模块若采用内置模块的访问方式是访问不到的

const moment = require('moment')---第三方模块

模块作用域: 作用域隔离 减少污染全局作用域

模块对象: 会自己暴露出可用的变量和方法,模块中都有一个module对象 包含当前模块信息,module.exports可以将模块中的内容共享出去
module.exports与exports对象指向同一个对象(默认) 但若重新为exports设置对象,则module.exports就不与它指向同一对象了 慎用exports={},无效! 应为exports.userName = 'ddd',因此大多数时候还是用module.exports保险,不要混用

内容小结:

node为js的后端运行环境,结合相关类库可以做很多事,有自己的模块化规范-commonJs,模块引用需要注意

内置模块(path、fs、http)

path路径处理模块

path.join([…pathname]) . 拼接路径 …/会向上到前一路径的上一级路径(join('/a/b', '../')==> /a) path.basename() 从路径中解析出文件名

使用+拼接路径可能出现问题('/a' + './code/1.txt' :出问题,join在此时会忽略.),尽量使用path.join 如下join都能正常工作,灵活性很好

console.log(path.join(__dirname, '/2.txt'), '\r\n','1',__dirname)
console.log(path.join(__dirname, '2.txt'), '\r\n', '1',__dirname)

path.extName获取路径中的文件扩展名

fs 模块

readFile方法(path[, option], callback)读取文件 --宏任务还是微任务?都不是,node有自己的事件循环机制 path选定文件、option指定配置-编码格式,默认utf8、执行操作文件的回调函数

const fs = require('fs')
fs.readFile('./分页.txt', 'utf8', function(err, dataStr) {    
        console.log(err)
        console.log(dataStr)
})

回调函数中,读取文件成功,返回文件文本,失败返回错误对象如:
[Error: ENOENT: no such file or directory, open './分页1.txt'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: './分页1.txt'
}

writeFile方法(path, data[, option], callback)写入文件
fs写文件,文件存在覆盖内容,文件不存在会创建,但不会创建目录
fs.writeFile('d:////2.txt', '写入文件', function(err) {
    console.log(err)
})

成功,err返回null,可据此判断,失败返回形如:
[Error: ENOENT: no such file or directory, open 'd:////2.txt'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: 'd:////2.txt'
}

处理文件路径问题:使用写死路径 'c:\day1\code.js',但写死路径移植性差 __dirname(返回当前文件的直到父级dir的绝对路径),用它进行拼接就比较灵活===>/Users/mac/Documents/iCollections/common/nodeTest

http模块

nodejs提供的用来创建web服务器的 web服务器软件:IIS、Apache nodejs通过http模块,对外提供web服务,不用安装服务器软件

一台服务求可以有很多web服务,通过一个端口只标识一个特殊的web服务 web服务的80端口可以被省略

创建web服务器

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
    req请求对象:(包含客户端信息)url(客户端url)\method(客户端请求方式)
    res响应对象,向客户端发一些信息
    console.log('someone visit web server')
})
server.listen(80, function() {
    console.log('启动web服务器')
})

内容小结:

究其功用,侧重于io处理的内置模块(fs,path,http),如文件读写,网络请求处理