Node.js

一、Node.js 基础

Node.js 是除了浏览器之外的,另一个 JavaScript 的运行环境。

1.1全局对象和全局函数

Javascript包括DOM、BOM 和 ECMScript,将javascript的核心ECMScript抽象剥离出来放到一个新的环境Node里使用。并且赋予新的对象和方法。

1.1.1全局对象

全局对象
global 在脚本模式下,申明的变量和函数都不属于全局对象global

1.1.2Node提供的全局函数

  • 立即执行定时器(setImmediate/clearImmediate)
setImmediate(() =>{  //无需第二个事件参数,在事件队列开始之前执行
	console.log(2)
})

为避免由进程阻塞,JS会将执行事件长的程序放到事件队列中,主线程执行完以后会执行事件队列
执行顺序
process.nextTick(进程立即执行定时器):运行再主程序的下一步,执行完主程序后先执行nextTick 后执行setTimeout函数。

process.nextTick(() =>{ //在主进程结束之后执行
	console.log(5)
})

1.2模块:具有特定功能的对象

1.2.1 内置模块(跟随node.js一起安装)

1.2.1.1 console函数

计时函数

console.time('for')
for(let i = 0 ; i<10000; i++){

}
console.timeEnd('for')
1.2.1.2 process

process对象是一个全局变量,无需使用require()

console.log(process.cwd());//工作目录
console.log(process.env);//环境变量
console.log(process.arch);//X64 系统架构 
process.env.NODE_ENV = 'devlop'//可以自定义环境变量
//获取进程编号,只有在进程运行过程中会存在,每个进程拥有自己唯一的id
console.log(process.pid);

杀死进程
process.kill(进程编号)//返回true为杀死成功

1.2.1.3 path

需要require引入 const path = require('path')

console.log(__dirname)//获取当前文件所在目录
console.log(__filename)//获取当前文件所在完成路径
console.log(path.extname(__filename))//获取文件的扩展名
//获取路径中的目录功能
console.log(path.dirname(__filename))
//获取路径中的文件名
console.log(path.basename(__filename))
//合并路径
const t = path.join(__dirname,'..')//上一级的路径
//多个路径合并
const a = path.join('D:/','a','b','c.png')
console.log(a)//D:\a\b\c.png
1.2.1.4 操作文件

fs提供了文件操作的API,需要通过require引入

  1. 文件写入
  • 清空写入语法: fs.writeFile(‘文件路径’,‘写入内容’,回调函数)
  • 追加写入语法:fs.appendFile(‘文件路径’,回调函数)
       // 使用 fs 之前先引入
       const fs = require('fs')
       fs.writeFile('./1.txt', '曾经有一首歌,她感动了我', (err) => {
           if (err) throw err
           console.log('写入成功')
       })
       fs.appendFile(__dirname+'/2.txt', '曾经有一首歌,她是这样唱的\n', (err) => {
           if (err) throw err
           console.log('追加写入成功') 
       })
  1. 文件读取
    语法:fs.readFile(‘文件路径’, 回调函数)
fs.readFile('./1.txt', (err, data) => {
             if (err) throw err
             // data 是二进制数据,默认输出时,以十六进制的方式展示
             // 想要看到正常的效果,需要通过 toString() 转换
             console.log(data.toString())
         })
  1. 文件删除
    语法: fs.unlink(‘文件路径’, 回调函数)
 fs.unlink(__dirname+'/1.txt', (err) => {
             if (err) throw err
             console.log('删除成功')
         })
1.1.2.5目录操作
  1. 创建目录语法:fs.mkdir('目录路径',回调函数)
  fs.mkdir('./d1', (err) => {
           if (err) throw err
           console.log('创建成功')
         })
  1. 删除目录:fs.rmdir('目录路径',回调函数)

  2. 重命名目录:fs.rename('旧路径','新路径',回调函数)

  3. 读取目录:fs.readdir('目录路径',回调函数)

fs.readdir(__dirname, (err, data) => {
           if (err) throw err
           // console.log(data) // data 是数组
           data.map((d) => {
             console.log(d)
           })
         })
         // 判断文件是否存在
         if (!fs.existsSync('./d2')) {
           fs.mkdirSync('./d2')
         }

函数执行方式
异步函数参数中都有回调函数

1.1.2.6 查看状态

语法:fs.stat(路径及文件名,回调函数)

      fs.stat(__dirname+"/a.txt", (err, stat) => {
           if (err) throw err
           if (stat.isDirectory()) {
             // 判断当前文件是否是目录
             console.log('目录:', d)
           } else if (stat.isFile()) {
             // 判断当前文件是否是普通文件
             console.log('文件:', d)
           }
         })
1.1.2.7 文件流

优势:内存效率提高,无需加载大量数据,流把大数据切成小块,占用内存更少;事件效率提高,获取数据后立即处理,无需等到内存缓冲填满

  • 读取流
    var readStream = fs.createReadStream(./1.txt)
  • 写入流
    vsr writeStream = fs.createWriteStream(./2.txt)
  • 读取流传入写入流
    readStream.pipe(writeStream)
1.1.2.8 Http发布Web服务
const http = require('http')
const server = http.createServer((req,res) =>{
    res.statusCode = 200
    res.setHeader('Content-Type':'text/plain')
    res.end('hello')
})
const port = 3000
const host = `localhost` 
server.listen(port,host,()=>{
    console.log('服务器运行在http://$(host):$(port)')
})

1.2.2 自定义模块

在Node.js中每个单独的.js文件,就是一个模块,每个模块都有抱一个module 变量,代表当前模块,module的exports属性是对外的接口,只有导出(module.exports)的属性和方法才能被外部调用,未导出的内容是模块私有,不能被外部访问。需要require引入.
引入自定义文件模块引入时需要添加引入文件的路径,不添加路径默认为内置模块。
引入目录模块时需要找到指定路径下的目录然后引入入口文件。默认的入口文件时index.js,没有index.js文件则入口文件由package.js 文件的main属性指定。

//package.js
    {
        "main":"a.js" //通过main属性将a.js引入
    }
//a.js文件
const b = require(__dirname+'b.js')//从a.js引入b.js
function foo(){
  console.log("a.js")
}
module.exports = {
  foo //将方法导出
}

若引入目录模块没有书写路径,则到当前目录下的mode_modules 目录中寻找dir02;如果找不到会回到上一级目录中寻找,直到顶层目录。找到目录模块dir02后引入dir02中的入口文件

1.2.3 第三方模块

使用第三方模块时,需要安装,并且要require。
全局安装 -g 项目安装 -s 开发上线都要,-d开发要上线不要

二、自动化构建

利用工具完成代码的压缩,将less转成css,ES6语法转为ES5兼容性语法,代码格式校验

2.1 npm script(最简单的自动化构建方式)

npm run 后面执行的时package.json文件中script字段下的命令

"script":{
  "foo": "node bar.js"
}
npm run foo //等同于执行node bar.js

可以将多个命令放到script中,按照一定的执行方式执行

2.1.1 npm script命令的执行方式

  1. 并行执行 (同时运行)
    任务1&任务2
  2. 串行执行(先后运行)
    任务1&&任务2
    由于window下无法使用&(并行执行),所以需要添加npm-run-all插件
"script":{
  "foo": "node bar.js",
  "t1":"node task1.js",
  "t2":"node task2.js",
  "t3":"node task3.js",
  "p": "run-p t1 t2 t3",//并行执行三个任务
  "s": "run-p t1 t2 t3"//串行执行三个任务
}
npm start s

2.1.2 构建样式文件

将css源代码转成上线环境中的代码

  1. 编译 less 文件
npm i less -g// 安装 less 包,编译 less 文件
// 在 package.json 中,添加 less 解析命令
"scripts": {
    "style": "lessc style.less style.css",
}
npm run style// 执行命令(自动编译)
  1. 压缩 css 文件
npm i minify -g//安装 minify 包, 压缩文件
// 在 package.json 中,添加 less 解析命令
"scripts": {
    //先编译 && 然后压缩
    "style": "lessc style.less style.css && minify style.css > style.min.css",
}
npm run style//执行命令(自动编译)

2.1.3 构建脚本文件

将js文件中ES6+新特性转为ES5的语法,常用编译工具Babel 。[Babel]: https://babeljs.io/

npm i -g babel-core babel-cli//安装 babel核心,Babel客户端
npm i -g babel-preset-env//安装转码规则
//在项目根目录下,新建 .babelrc 文件(注意文件名前有一个点),并添加转换规则
{
    "presets": [
      "env"
    ],
}
babel input.js --out-file output.js// 通过 babel 编译单个 j s文件
//或者 
babel input.js -o output.js
babel js --out-dir scripts //通过 babel 编译整个目录
// 或者
babel js -d scripts
//在 package.json 中,添加 babel 解析命令
"scripts": {
    "script": "babel js -d scripts",
}
npm run script//执行命令(自动编译)

如果 Babel 是局部安装。则babel 的可执行路径是:./node_modules/.bin/babel命令需要做相应的调整

babel js -d scripts ===>./node_modules/.bin/babel js -d scripts

添加压缩命令

# 在 package.json 中,添加 babel 解析和压缩命令
"scripts": {
    "script": "babel js -d scripts && minify scripts/main.js > scripts/script.min.js",
}

2.1.4 代码格式校验

统一团队成员编码规范,利用ESLint工具检测 官网:(https://eslint.org/)
使用步骤:

  1. 创建项目
mkdir lint-demo
cd lint-demo
//初始化项目,生成 package.json
npm init --yes
  1. 安装 ESLint:npm i eslint -g
  2. 初始化一个配置文件:
//之后进入交互窗口,询问一些问题;根据问题生成配置文件 例如:.eslintrc.json
$ eslint --init
  1. 配置规则
rules: {
    "规则名": [规则值, 规则配置]
}
/*
其中规则值有以下 3 种:0 = off, 1 = warn, 2 = error
 "off" 或 0 - 关闭规则
 "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
 "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
*/

更多规则详情查看:(https://eslint.org/docs/rules/)
例如:

///配置检测规则
{
    "env": {
        "browser": true,
        "commonjs": true,
        "es2021": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaVersion": 12
    },
    "rules": {
        "indent": [ "error", 2 ],       # 使用两个空格缩进
        "quotes": [ "error", "double" ] # 使用双引号包裹字符串
    }
}

之后,你可以在任何文件或目录上运行ESLint如下:

$ eslint yourfile.js

拓展阅读:检测 JS 代码风格的工具有多个,除了 ESLint, 另一个常用的是 Standard:

https://github.com/standard/standard

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值