在Node中,采用ES进行编程,没有DOM、BOM(document、window),Node偏底层
使用规范:
- 字符串使用单引号’’
- 关键字、函数名加空格
- 使用===
- 要处理err
- 使用浏览器全局变量时加上window前缀,document和navigator除外
- 当一行代码是以 ( [ ` 开头的时候,在这三个符号之前加一个分号
反引号时ES6 中新增的模板字符串,支持换行和拼接变量
核心模块
fs(文件系统)核心模块(文件操作功能)
fs(文件系统)核心模块,提供了所有文件操作的API
- 使用require加载fs核心模块
var fs = require('fs')
- 读文件
fs.readFile('a.txt ',function(err,data){console.log(data.toString());})
参1:读取文件路径,参2:回调函数 ,可以使用data.toString() - 写文件
fs.writeFile('a.txt','nihao',function(error){console.log("写入成功!");})
http核心模块(创建编写服务器)
- 加载http核心模块
var http = require('http')
- 使用http.creatServer()创建一个Web服务器,返回一个server实例
var server = http.creatServer()
- 服务器的作用:提供对数据的服务、发请求、接收请求、处理请求、响应请求
server.on('request',function(req,res){})
request请求事件处理函数,有2个参数:a. request 请求对象:来获取客户端的一些请求信息,例如请求路径
b. response 响应对象:发送响应信息
地址:req.socket.remoteAddress
端口号:req.socket.remotePort
IP地址用来定位计算机,端口号用来定位具体的应用程序
一个端口号同一时间只能被一个程序占用,但是计算机可以同时开启多个服务
服务端默认发送的数据是utf-8编码的内容,可能会与操作系统默认的编码不一样
response.setHeader(‘告知数据的类型’,‘text/plain普通文本类型、html使用 text/html;charset=utf-8’)【HTML页面中通过meta也可以】
server.on("request",function(req,res){
console.log("收到客户端请求,请求路径:"+req.url)
console.log("地址:",req.socket.remoteAddress,req.socket.remotePort)
var url = request.url
if(url === '/'){
fs.readFile('./htmla/a.html',function(err,data){
if(err){
response.setHeader('Content-Type','text/plain;charset=utf-8')
response.end('文件读取失败,请稍后重试!')
}else{
response.setHeader('Content-Type','text/html;charset=utf-8')
response.end(data)
}
})
})
- 启动服务器,绑定端口号(网络通信)
server.listen(3000,function(){console.log(3000,running...})
- 关闭使用crtl+C
os核心模块
- 加载os核心模块
var os= require('os')
console.log(os.cpus())
返回一个对象数组,其中包含有关每个逻辑CPU内核的信息。console.log(os.totalmem())
以整数形式返回系统内存总量(以字节为单位)。
path核心模块
- 加载path核心模块
var path= require('path')
- ` path.extname(‘index.html’)`` // Returns: ‘.html’
path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: ‘quux.html’path.dirname('/foo/bar/baz/asdf/quux');
// Returns: ‘/foo/bar/baz/asdf’path.parse('/home/user/dir/file.txt')
// Returns: {root:’/’,dir:’/home/uesr/dir’,base:‘file.txt’,ext:’.txt’,name:‘file’}path.join('/foo','bar','baz/sa','..')
// Returns: ‘/foo/bar/baz/sa’
Node中的其他成员:在每个模块中除了require、exports等模块相关API之外,还有两个特殊成员
- __dirname:用来获取当前文件模块所属目录的绝对路径
- __filename:用来获取当前文件的绝对路径
在文件操作中,使用相对路径是不可靠的,文件操作中的路径被设计为相对于执行node命令所处的路径(相对路径)
解决方法:将相对路径变为动态的绝对路径(使用__dirname/__filename)path.join(__dirname,'./a.txt')
注意: 模块中的路径标识和文件操作中的路径标识不一样,模块中的路径标识就是相对于当前文件模块,不受执行node命令所处的路径影响。
模块化
什么是模块化?
- 文件作用域(只有模块作用域,没有全局作用域)
- 通信规则(使用require来加载模块 、使用exports接口对象来导出模块中的成员)
简单的模块化(优先从缓存加载)
require加载的模块有三种。
- 用户自己编写的文件模块,使用相对路径,加 ./ 当前目录(不可省) …/ 上一级目录
require('./a')
或者require(''./a.js)
思考? 如何使模块与模块之间进行通信。
在每个文件模块中都提供了一个exports对象,默认为空{}
在b.js文件中:
var foo = 'a'
exports.foo = 'b'
console.log(exports) // Returns : { foo: 'b' }
在 a.js文件中:
var aExports = require('./b')
console.log(aExports) // Returns : { foo: 'b' }
console.log(aExports.foo) // Returns : b
思考? 如何使用exports导出多个成员(必须在对象中)?
var foo = 'a'
exports.foo = 'b'
exports.a = 123
exports.b = function(){}
console.log(exports)
如果一个模块需要直接导出某个成员,拿到的是函数/字符串,而非挂载的方式,使用module.exports
在Node中,每个模块内部都有一个自己的module对象var module = {}
该module对象中有一个成员:exports ,默认在代码的最后一句有return module.exports
注意: module 是对象,exports也是对象
var module = {
export:{}
}
var foo = 'a'
function add(x,y) {
return x+y
}
exports = add
exports.foo = 'abc'
exports.a = '123' // Return:{}
单用exports加载不了函数,要加载函数必须要用module.exports
var foo = 'a'
function add(x,y) {
return x+y
}
module.exports = add
module.exports.foo = 'abc'
module.exports.a = '123 // Return : [Function: add] { foo: 'abc', a: '123' }
var a = aExports(1,2)
console.log(a) // Retuen: 3
关于路径
- 文件操作中的相对路径可以省略
./data/a.txt
、data/a.txt
、/data/a.txt
都是相对于当前目录 - 模块加载中,相对路径中的./不能省略