node基础
node.js
node.js是基于v8引擎的JavaScript运行环境
终端快捷键
使用↑键可以快速定位到上一次执行的命令
使用tab键能够快速补全路径
使用esc键可以快速清空当前已输入命令
输入cls可以清空当前窗口
fs( file system )文件系统模块
fs模块,nodejs用来操作文件的模块
fs.readFile() 读取指定文件中的内容
fs.readFile(path[,options],callback)
- 参数path:必选参数,字符串的文件路径
- 参数option:可选参数,表示以什么编码格式来读取文件
- 参数callback:必选参数,文件读取后执行的回调函数
示例,以utf8编码格式读取txt
const fs = require('fs')
fs.readFile('./files/1.txt','utf8',function(err,dataStr){
if(err) return err
console.log(dataStr)
})
如果读取成功err为null,如果读取失败,err的值为错误对象,dataStr的值为undefined
fs.writeFile() 写入文件或创建文件
fs.writeFile(fileName,data[,options],callback)
- 参数path:要写入内容或要创建的文件路径
- 参数data:表示要写入的内容
- 参数option:表示以什么格式写入文件内容,默认值是utf8
- 参数callback:文件写入内容之后执行的回调函数
注意点:
- 重复使用writeFile会覆盖文件内容
- writeFile方法只能创建文件,不能创建文件夹
fs模块路径动态拼接问题:
在node执行路径命令时候,./ 和 ../ 是根据node执行时所在的位置开始执行的,很容易会导致从执行位置开始找文件。
解决此方法可以使用绝对路径
__dirname 基于当前文件所处的目录
在node执行路径命令时候,./ 和 ../ 是根据node执行时所在的位置开始执行的,使用 __dirname
就可以基于当前nodejs文件的路径开始找, __dirname
就是当前文件的绝对路径。
多数情况下,使用 __dirname
之后依靠的就是绝对路径,如果使用+号拼接基本不会再跟 ./ 和 ../,如果使用path.join就可以用 ./和../
path 模块
path模块,nodejs用来处理路径的模块。
const path = require('path')
path.join() 路径拼接
path.join([...paths])
参数 ...paths :代表任意多个路径片段
返回值为string类型,例子:
const path = require('path')
const pathStr = path.join('/a','/b/c','../','./d','e')
console.log(pathStr) //会输出a\b\d\e
path.basename() 获取路径最后一部分
path.basename(path[,ext])
参数path:表示一个路径的字符串
参数ext:表示文件拓展名,传入拓展名之后返回值就不带拓展名
返回值:表示路径中的最后一部分
const path = require('path')
let fpath = '/a/b/c/index.html'
let fullName = path.basename(fpath)
console.log(fullName) //返回index.html
let notExt = path.basename(fpath,'html')
console.log(notExt) //返回index
path.extname() 获取路径中的文件拓展名
path.extname(path)
参数path:表示一个路径的字符串
返回值:<string>文件的拓展名部分(带.)
http 模块
http 模块是nodejs官方提供的、用来创建web服务器的模块。通过http模块提供的 http.createServer() 方法,就可以创建服务器应用
创建基本服务器
创建基本服务器四个步骤:
- 引入http模块
const http = require('http')
- 调用http模块里的createServer方法
const server = http.createServer()
- 为服务器实例绑定request事件
server.on('request',(req,res)=>{
回调函数执行内容
})
- 调用服务器实例的listen方法,参数1为端口号,纯Number类型,参数2为回调函数
server.listen(80,()=>{
启动成功后执行的回调函数
})
req 请求对象
server.on('request',(req,res)=>{
回调函数执行内容
})
服务器绑定事件中,回调函数的req对象拥有着许多包含 发出请求的客户端 的属性,例如
req.url 请求所需要的的url是什么(只包含后面的路径)
req.method 请求对象所使用的方法
res 响应对象
服务器绑定事件中,回调函数的req对象拥有着许多 服务器相关 的属性与方法,例如
res.end() | 向客户端发送指定的内容,并结束这次请求的处理过程 |
res 响应头设置
响应头可以设置字符编码解决中文乱码问题
res.setHeader('Content-Type','text/html;charset=utf-8')
模块化
模块化加载
使用 require() 方法即可,加载内置模块和第三方模块直接写名字,加载自定义模块需要写上路径
module对象
每个模块都有一个module对象,里面有着很多属性,例如path、filename、exports
module.exports 向外共享模块作用域
- 在自定义模块中,可以使用module.exports 对象,将模块内的成员共享出去,供需导入的文件使用。
- 另一个文件用require() 方法导入自定义模块时,得到的就是module.exports 所指向的对象。
- 在自定义模块中,默认的 module.exports = {} ,也就是一个空对象。
- module.exports 是一个对象,可以使用点.的形式将东西挂载到这个对象上
modeule.exports.username = 'zs'
module.exports.sayHello = ()=>{
console.log('hello')
}
exports 对象
由于 module.exports 单词写起来比较复杂,为了简化,node 提供了 exports 对象。
默认情况下exports 和 module.exports 指向同一个对象。
最终结果以 module.exports 为准
module.exports = {
gender: 'man',
age: 22
}
exports.username = 'zs'
最终另一个文件导入得到的是 module.exports 的东西.
为了防止混乱,尽量不要在一个模块中同时使用exports 和 module.exports
ComonJS模块化规范
- 每个模块内部,module变量代表当前模块。
- module变量是一个对象,它的exports/module.exports属性是对外接口
- require()方法用于加载模块。加载某个模块,其实是加载该模块的module.exports属性。
npm
npm 包共享平台,官网 [npmjs.com]。
Node Package Manager ,npm包管理工具,nodejs安装的时候会一起安装到电脑上
npm项目初始化
npm init -y
执行此命令,会生成一个package.json配置文件。
注意:命令只能在英文且没有空格的目录下成功运行
npm 国内镜像
查询当前下载包的地址和切换下载包的地址
npm config get registry
npm config set registry=https://registry.npmmirror.com/
或者使用nrm工具,安装-查询所有可用镜像源-切换为淘宝镜像源
nrm i nrm -g
nrm ls
nrm use taobao
npm 安装包命令
npm install 包的完整名称
简写形式
npm i 包的完整名称
安装指定版本的包,在包名后面接@然后写上版本号
npm i moment@2.22.2
安装包,并只在开发环境用到(记录到开发依赖上)
npm install 包名 --save-dev
//或简写形式,包名与杠D顺序可调换
npm i 包名 -D
安装全局包,运行环境下使用的包
npm install 包名 -g
npm i 包名 -g
引用包
const 包的名称 = require('包的名称')
通常,引用包的时候用的变量接收的那个变量名,通常和包同名
卸载包
npm uninstall 具体包的名字
npm uninstall moment
npm 自动创建的文件
初次安装包后,目录下会多出一个 node_modules
文件夹和 package-lock.json
文件,其中
- node_modules 文件夹用来存放所有已安装到项目中的包,require() 导入第三方包时,就是从这个目录查找。通常需要把这个文件夹添加到.gitignore忽略文件里去
- package-lock.json 配置文件用来记录 node_modules 目录下每一个包的下载信息,例如包的名字、版本号、下载地址等
项目init初始化后会生成一个package.json 配置文件,用来记录与项目有关的一些配置信息。
例如:项目的名称、版本号、描述等。项目中都用到了那些包。哪些包只在开发期间会用到。哪些包在开发和部署时都需要用到。
package.json
dependencies 依赖节点
packagejson文件的此属性会记录该项目依赖哪些第三方npm包和版本号。
devDependencies 开发依赖节点
此属性会记录哪些包只在项目开发阶段会用到,在项目上线后不会用到的。
当我们拿到一个剔除了node_modules文件夹的项目时候,通常使用 npm install
命令(或npm i)安装所有denpendencies和devDependencies节点里记录的所有包
创建npm包
一个合格的npm包必须满足这几个条件
- 包必须以单独的目录而存在
- 包的顶级目录下必须包含 package.json
- package.json 中必须包含name,version,main。分别代表包的名字、版本号、包的入口
发布npm包的相关指令
登录到npm和发布包
npm login
npm publish
删除72小时内已发布的包
npm unpublish 包名 --force
模块加载机制
- 模块在第一次加载后会被缓存。这也意味着多次调用 require() 不会导致模块的代码被执行多次
- 内置模块、自定义模块、第三方模块。都会优先从缓存中加载。
- 内置模块加载优先度最高。
- 如果加载模块时没有 ./ 或 ../ 这样的路径标识符,会当作内置模块或第三方模块进行加载,一直往上级目录的node_modules 文件夹查找
- 加载时候如果没有文件后缀名会按 .js .json .node 后缀顺序加载
- 加载当目录(文件夹)作为模块的时候,会先从package.json 寻找main属性作为入口。如果没有,则加载目录下的index.js