Node.js的学习笔记(1)核心模块+模块化

在Node中,采用ES进行编程,没有DOM、BOM(document、window),Node偏底层

使用规范:

  1. 字符串使用单引号’’
  2. 关键字、函数名加空格
  3. 使用===
  4. 要处理err
  5. 使用浏览器全局变量时加上window前缀,document和navigator除外
  6. 当一行代码是以 ( [ ` 开头的时候,在这三个符号之前加一个分号
    反引号时ES6 中新增的模板字符串,支持换行和拼接变量

核心模块

fs(文件系统)核心模块(文件操作功能)

fs(文件系统)核心模块,提供了所有文件操作的API

  1. 使用require加载fs核心模块 var fs = require('fs')
  2. 读文件 fs.readFile('a.txt ',function(err,data){console.log(data.toString());}) 参1:读取文件路径,参2:回调函数 ,可以使用data.toString()
  3. 写文件fs.writeFile('a.txt','nihao',function(error){console.log("写入成功!");})

http核心模块(创建编写服务器)

  1. 加载http核心模块 var http = require('http')
  2. 使用http.creatServer()创建一个Web服务器,返回一个server实例 var server = http.creatServer()
  3. 服务器的作用:提供对数据的服务、发请求、接收请求、处理请求、响应请求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)
            }
        })
})
  1. 启动服务器,绑定端口号(网络通信)server.listen(3000,function(){console.log(3000,running...})
  2. 关闭使用crtl+C

os核心模块

  1. 加载os核心模块 var os= require('os')
  2. console.log(os.cpus()) 返回一个对象数组,其中包含有关每个逻辑CPU内核的信息。
  3. console.log(os.totalmem()) 以整数形式返回系统内存总量(以字节为单位)。

path核心模块

  1. 加载path核心模块 var path= require('path')
  2. ` path.extname(‘index.html’)`` // Returns: ‘.html’
  3. path.basename('/foo/bar/baz/asdf/quux.html'); // Returns: ‘quux.html’
  4. path.dirname('/foo/bar/baz/asdf/quux'); // Returns: ‘/foo/bar/baz/asdf’
  5. path.parse('/home/user/dir/file.txt') // Returns: {root:’/’,dir:’/home/uesr/dir’,base:‘file.txt’,ext:’.txt’,name:‘file’}
  6. path.join('/foo','bar','baz/sa','..') // Returns: ‘/foo/bar/baz/sa’

Node中的其他成员:在每个模块中除了require、exports等模块相关API之外,还有两个特殊成员

  1. __dirname:用来获取当前文件模块所属目录的绝对路径
  2. __filename:用来获取当前文件的绝对路径
    在文件操作中,使用相对路径是不可靠的,文件操作中的路径被设计为相对于执行node命令所处的路径(相对路径)
    解决方法:将相对路径变为动态的绝对路径(使用__dirname/__filename)path.join(__dirname,'./a.txt')

注意: 模块中的路径标识和文件操作中的路径标识不一样,模块中的路径标识就是相对于当前文件模块,不受执行node命令所处的路径影响。

模块化

什么是模块化?

  1. 文件作用域(只有模块作用域,没有全局作用域)
  2. 通信规则(使用require来加载模块 、使用exports接口对象来导出模块中的成员

简单的模块化(优先从缓存加载)

require加载的模块有三种。

  1. 用户自己编写的文件模块,使用相对路径,加 ./ 当前目录(不可省) …/ 上一级目录 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
关于路径
  1. 文件操作中的相对路径可以省略 ./data/a.txtdata/a.txt/data/a.txt 都是相对于当前目录
  2. 模块加载中,相对路径中的./不能省略
发布了4 篇原创文章 · 获赞 3 · 访问量 85

猜你喜欢

转载自blog.csdn.net/fAng_ER_/article/details/104037595
今日推荐