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:文件写入内容之后执行的回调函数

注意点:

  1. 重复使用writeFile会覆盖文件内容
  2. 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() 方法,就可以创建服务器应用

创建基本服务器

创建基本服务器四个步骤:

  1. 引入http模块
const http = require('http')
  1. 调用http模块里的createServer方法
const server = http.createServer()
  1. 为服务器实例绑定request事件
server.on('request',(req,res)=>{
    回调函数执行内容
})
  1. 调用服务器实例的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模块化规范

  1. 每个模块内部,module变量代表当前模块。
  2. module变量是一个对象,它的exports/module.exports属性是对外接口
  3. 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包必须满足这几个条件

  1. 包必须以单独的目录而存在
  2. 包的顶级目录下必须包含 package.json
  3. 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • node环境安装 1.什么是Node.js?Node.js 是一个基于"Chrome V8 引擎" 的JavaSc...
    Gmn_微双阅读 213评论 0 1
  • 一、什么是node Node.js is a JavaScript runtime.It is built on ...
    Linyqs阅读 178评论 0 0
  • Node基础 为什么学习Node? IO优势对于文件读写,Node采用的是非阻塞IO传统IO在读写文件的时候CPU...
    Victor_818阅读 132评论 0 0
  • 一、模块化开发 之前我们做过一个练习,使用node运行一个js文件。但是在实际项目开发中,不可能将全部代码都写在一...
    lmonkey_01阅读 78评论 0 0
  • Node回调函数 node是非堵塞,比如我们执行一个读取文件的操作,然后打印一句话,不需要等待文件读取完成,这样就...
    ccc往事随风阅读 253评论 0 1