浏览器通过js解析引擎执行js代码,不同的浏览器使用不同的js引擎。
其中v8引擎性能最好
每个浏览器都内置了dom、bom API,js调用这些api即可操作dom和bom
nodejs是基于v8引擎的js运行环境,他和浏览器类似,都是js的运行环境,只不过有如下区别:
node.js作为一个js的运行环境,仅仅提供了基础的功能和api。然而,基于node.js提供的这些基础功能,出现了很多强大的工具和框架:
浏览器中的js学习路径:
js基础语法 + 浏览器内置api(dom,bom)+第三方框架(jq,vue,react)
Node.js的学习路径:
ji基础语法 + node.js内置api(fs,path,http) + 第三方模块(express,koa2,mysql)
在js中使用的时候,需要先引入
const fs = require('fs')
fs.readFile()
读取指定文件中的内容
fs.readFile(path, format, cb) path: 必选参数,文件路径 format:可选,以什么编码格式来读取文件,比如'utf8' cb:必选,文件读取完毕后的回调,回调的第一个参数是error,第二个参数是文件读取结果。若读取成功,error为null
fs.writeFile()
向指定的文件中写入内容,会直接覆盖掉文件里内容
fs.readFile(path, data, format, cb) format: 默认utf8 data: 必选,要写入的内容 cb: 回调,参数error,若写入成功,error为null
相对路径会出现的问题
在使用fs操作文件时,如果路径采用的是相对路径,容易出现问题,原因是:node执行js代码的时候,会根据执行node命令时所处的目录,动态拼接出被操作文件的完整路径。
解决方法:
采用绝对路径
__dirname: 代表当前文件所处的目录
使用的时候,同样需要先引入:
const path = require('path')
path.join()
将多个路径片段拼接成完整的路径字符串,经常配合__dirname使用。注意’…/'会抵消前面的路径
console.log(path.join('/a', '/b/c', '../', '/d'))//\a\b\d
//当前目录:D:\test path.join(__dirname, 'a')//D:\test\a path.join(__dirname, '/a')//D:\test\a path.join(__dirname, './a')//D:\test\a path.join(__dirname, '../a')//D:\a
path.basename()
获取路径中的最后一部分,可以用来获取文件名
path.basename(path, ext) //参数path: 必选,路径 //参数ext:可选,文件扩展名 //返回值: 路径中的最后一部分
path.basename('a/b/index.html')//index.html path.basename('a/b/index.html', '.html')//index path.basename('a/b/index.html/')//index.html path.basename('a/b/index')//index
path.extname()
获取文件扩展名
path.extname(path)
path.extname('a/index.html')//.html
用来创建web服务器。服务器与普通电脑的区别在于,服务器上安装了web服务器软件,例如: IIS,Apache等。
在nodejs中,我们不需要安装第三方服务器软件,通过http模块,几行简单的代码就能实现一个服务器。
同样需要先导入:
const http = require('http')
服务器相关概念
域名和域名服务器
ip地址和域名是一一对应关系,这份关系映射存放在域名服务器上(DNS)。域名服务器就是提供ip地址和域名之间转换服务的服务器。
创建最基本的web服务器
导入http模块
const http = require('http')
创建web服务器实例
const server = http.createServer()
为服务器绑定request事件,监听客户端请求
server.on('request', (req, res) => { })
req请求对象
它包含了与客户端相关的数据和属性,例如:
req.url是客户端请求的url地址
req.method是请求类型
res响应对象
它包含了与服务器相关的数据和属性,例如:
解决中文乱码问题
当调用res.end()方法,向客户端发送中文内容时,会出现乱码问题,此时需要手动设置编码格式:
启动服务器
server.listen(80, () =>{ })
根据不同的url做出不同的响应
server.on('request', (req, res) =>{ const url = req.url let content = '<h1>404 Not found!</h1>' if(url === '/' || url === '/index.html') { content = '<h1>首页</h1>' } else if(url === '/about.html') { content = '<h1>关于页面</h1>' } res.setHeader('Content-type', 'text/html; charset=utf-8') res.end(content) })
模块化就是遵守特定的规则,将一个大的系统或者说是文件,拆分成多个独立并且相互依赖的小模块。
模块化的好处是:
模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的特定规则。例如:
nodejs中根据模块来源的不同,分为三大类:
上面说的三类模块,都采用require()方法进行加载。需要注意的是,使用require加载模块时,会执行被加载模块中的代码。另外,可以省略.js后缀名
和函数作用域类似,在模块中定义的变量、方法等成员,只能在模块内部访问,这种模块级别的限制,叫做模块作用域。
每个nodejs模块中都有一个module对象,它里面存储了当前模块的相关信息,打印如下:
可以使用module.exports对象,将模块内的成员暴露出去,供外界使用。
外界用require()方法导入时,得到的其实就是module.exports所指向的对象。