nodejs 笔记1 基础知识
是什么
基于chrome v8引擎的js运行环境
浏览器是JS的前端运行环境,浏览器提供DOM,BOM,AJAX等API
NODE是JS的后端运行环境,NODE提供FS,PATH,HTTP等API
为什么
使用JS语言完成前端以外的工作
- 构建WEB应用(Express)
- 跨平台桌面应用(Electron)
- API接口项目(restify)
运行JS
node hello.js
内置模块
FS文件系统
- 读取文件
// 导入模块
const fs = require('fs')
// 参数:路径,编码格式(可选,默认utf8),处理读取结果回调
fs.readFile('./1.txt', 'utf8', function(err, dataStr) {
})
- 写入文件
// 参数:路径,内容,编码格式(可选,默认utf8),处理写入完成回调
fs.writeFile('./1.txt', 'abc', 'utf8', function(err) {
}
PATH路径
// 导入模块
const path = require('path')
// 拼接路径
path.join('\a','\b','..\c')
// 获取文件名
filepath = '/a/b/index.html'
path.basename(filepath) // 带扩展名 index.html
path.basename(filepath,'.html') // 去扩展名 index
// 获取扩展名
path.extname(filepath) // .html
HTTP
// 导入模块
const http = require('http')
// 创建服务
const server = http.createServer()
// 监听请求
server.on('request', (req, res) => {
// req.url 请求地址
// req.method 请求方法
// 设置响应头
req.setHeader('Content-Type', 'text/html; charset=utf-8')
fs.readFile(path.join(__dirname,url), (err, dataStr) => {
// 向客户端发送内容,并结束请求处理过程
if(err) return res.end('404 Not found')
res.end(dataStr)
})
})
// 启动服务(端口,启动完成回调)
server.listen(80, () => {})
模块化
内置模块:fs,path,http…
自定义模块:js文件
加载模块
const module = require(‘mname’)
加载模块时,会执行被加载模块中的代码
参数可以是:
- 内置模块名(fs,path,http…)
- js文件路径
- 第三方包名
- 包路径
注,如果为第三方包名或包路径时将导入包路径下(第三方包在node_modules目录下)配置文件(package.json)中main属性指向的入口js文件
模块作用域
自定义模块中定义的变量方法等成员,只能在模块内访问
向外共享模块成员
模块内有一个module对象,保存了模块信息
console.log(module)
Module {
id:’’,
path: ‘’,
exports: ‘’, // 共享出去的成员
parent: null,
filename: ‘’,
loaded: false,
children: [],
paths: []
}
导入模块时获得的对象就是module.exports所指向的对象,模块内还有一个exports对象,默认指向module.exports对象,
- 向module.exports上挂载成员
module.exports.username = '路过君'
exports.sayHello = function() {
console.log('hello')
}
// 或(注,此操作将导致模块内exports对象与module.exports不一致,最终导出对象以module.exports为准)
module.exports = {
username: '路过君',
sayHello: function() {...}
}
// 以下写法无效,导出结果以module.exports为准
exports = {
username: '路人甲'
}
// mymodule == {username: '路过君', sayHello: function() {...}}
const mymodule = require('mymodule')
模块化规范
CommonJS规范,规定模块特性,模块间如何互相依赖
- 模块内部,module变量代表当前模块
- module.exports属性是对外接口
- require()加载模块,其实是加载module.exports属性