node.js


node概念

node是基于Chrome V8引擎的JavaScript代码运行环境,全局对象是globle,在node环境下使用node命令执行后缀为.js的文件即可

CommonJS

commonJS是为js的表现制定规范,因为js没有模块化系统,标准库较少,缺乏包管理工具,CommonJS应运而生,它希望js可以在任何地方运行而不只是浏览器中,从而达到一些后端语言具有开发大型应用的能力。

commonJS与Node.js的关系:CommonJS时模块化的标准,Node.js是CommonJS(模块化)的实现

应用

  • 服务器端js的应用程序Node.js
  • 命令行工具
  • 桌面图形应用程序

node组成

ECMAScript和node环境提供的附加API

模块化开发

javasript使用存在文件依赖和命名冲突的问题,因而要使用模块化开发,模块化开发的含义是一个功能就是一个模块多个模块可以组成完整的应用,抽离一个模块不会影响其他模块的运行。node.js规定一个JavaScript就是一个模块,模块内部定义的变量和函数外部无法得到,需要使用exports对象进行成员导出,require方法导入其他模块。

模块的导入导出

  • 导出

    • exports

    • module.exports

    • 两者之间的关系

      module.exports 是真正的接口
      exports是一个辅助工具
      如果module.exports为空,那么所有的exports属性和方法都赋值module.exports
      如果module.exports具有任何方法和属性,则exports会被忽略

  • 导入

    • require

模块

  • 核心模块

    node自带的模块加载速度快

    • http模块

      • // 引用系统模块
         const http = require('http');
          // 创建web服务器
         const app = http.createServer();
          // 当客户端发送请求的时候
         app.on('request', (req, res) => {
                //  响应
               res.end('<h1>hi, user</h1>');
         });
          // 监听3000端口
         app.listen(3000);
         console.log('服务器已启动,监听3000端口,请访问 localhost:3000')
        

      请求方式

      get 请求数据 数据处理 参数放在地址栏中 参数获取需要借助系统模块url

      客户端请求途径:浏览器地址栏 link标签的href属性 script标签的src属性 img标签的src属性

       const http = require('http');
       // 导入url系统模块 用于处理url地址
       const url = require('url');
       const app = http.createServer();
       app.on('request', (req, res) => {
           // 将url路径的各个部分解析出来并返回对象
               // true 代表将参数解析为对象格式
           let {query} = url.parse(req.url, true);
           console.log(query);
       });
       app.listen(3000);

      ​ post 发送数据 实现某种功能 参数再请求体中 获取需要data和end事件 使用querystringstring系统模块将参数转为对象

      ​ 客户端请求途径:Form表单提交

       // 导入系统模块querystring 用于将HTTP参数转换为对象格式
       const querystring = require('querystring');
       app.on('request', (req, res) => {
           let postData = '';
           // 监听参数传输事件
           req.on('data', (chunk) => postData += chunk;);
           // 监听参数传输完毕事件
           req.on('end', () => { 
               console.log(querystring.parse(postData)); 
           }); 
       });

      请求地址

       app.on('request', (req, res) => {
           req.headers  // 获取请求报文
           req.url      // 获取请求地址
           req.method   // 获取请求方法
       });

      http状态码

      200 请求成功

      404 请求的资源没有被找到

      500 服务器端错误

      400 客户端请求有语法错误

    • url模块

      • parse 获取地址信息
      • resolve 追加或替换地址
      • formal 根据地址信息获得原url信息
    • fs文件管理

      • fs.stats 检测是文件还是文档

        • isDirctory() 是否文档
        • isFile() 是否文件
      • fs.mkdir 创建文档

      • fs.writeFile 创建写入文件

      • fs.appendFile 追加文件

      • fs.readdFile 读取文件

      • fs.readdir 读取文档

      • fs.rename 重命名或者剪切

      • fs.rmdir 删除文档

      • fs.unlink 删除文件

      • fs.createReadStream 读取流

        • on读取
      • fs.createWriteStream 写入流

        • write写入
        • end写完
        • on完成
    • path模块

      • path join() 拼接模块
      • __dirname 当前文件的绝对路径
  • 文件模块

    用户自己编写的模块,动态加载运行速度相对较慢

模块的加载机制

1.require方法根据模块路径查找模块,如果是完整路径,直接引入模块。
2.如果模块后缀省略,先找同名JS文件再找同名JS文件夹
3.如果找到了同名文件夹,找文件夹中的index.js
4.如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件
5.如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到

常用的第三方包

第三方模块:别人已经写好的,具有特定功能的,我们可以下载直接使用的模块,通常是有多个文件组合在一起放置自在一个文件夹中,又名包。
有两种存在形式,以js文件的形式存在,提供项目具体的api接口。
以命令行工具存在,辅助项目开发。
npmjs.com第三方模块存储和分发厂库

npm:node的第三方模块管理工具

下载:npm install/i 模块名
卸载:npm uninstall package 模块名
命令行工具:全局安装-g 可在计算机任何一个地方使用它
库文件:本地安装

nodemon:命令行工具辅助项目开发

下载:npm install -g nodemon
命令行工具用nodemon命令替代node命令执行文件
自动监听文件是否更新,如果更新就自动执行。

nrm :下载地址切换工具

下载:npm install nrm -g
查询下载地址:nrm ls
切换下载地址:nrm use 下载地址名

一般都是用淘宝镜像来安装

npm install -g cnpm --registry=https://registry.npm.taobao.org

Glup :基于node的前端构建工具

作用:将机械化的操作编写成任务,想要执行这些任务时,可以用一个命令任务就自动执行了,提高开发效率。

具体应用:项目上线,HTML CSS JS文件的压缩合并。
语法转换es6 less之类的
公共文件抽离
修改文件浏览器自动刷新

使用npm install gulp下载gulp库文件,在项目根目录下建立gulpfile.js文件,用``src目录放置源文件,dist目录放置构建后文件,在gulpfile.js文件中编写任务,在命令行工具执行gulp任务

const gulp = require('gulp');
// 复制文件夹
gulp.task('copy', () => {

    gulp.src('./src/images/*')
        .pipe(gulp.dest('dist/images'));

    gulp.src('./src/lib/*')
        .pipe(gulp.dest('dist/lib'))
});

// 构建任务
gulp.task('default', ['htmlmin', 'cssmin', 'jsmin', 'copy']);
  • gulp中提供的方法

    • gulp.src():获取任务要处理的文件
    • gulp.dest() 输出文件
    • gulp.task() 建立gulp任务
    • gulp.watach() 监控文件的变化
    • .pope() 放置要处理的文件
  • gulp插件

    插件网址:www.npmjs.com

    插件用法:下载 如:npm install gulp-htmlmin 引用:如:require gulp-htmlmin 调用

    npm install gulp-cil -g 安装gulp的命令行工具

    在文件名为.glupfile.js里面编写任务,相同路径下建立src文件夹存放源文件,在dist目录下存放修改后的文件

    • gulp-htmlmin html文件的压缩

      const gulp = require('gulp');
      const htmlmin = require('gulp-htmlmin');
      const fileinclude = require('gulp-file-include');
      // html任务
      // 1.html文件中代码的压缩操作
      // 2.抽取html文件中的公共代码
      gulp.task('htmlmin', () => {
          gulp.src('./src/*.html')
              .pipe(fileinclude())
              // 压缩html文件中的代码
              .pipe(htmlmin({ collapseWhitespace: true }))
              .pipe(gulp.dest('dist'));
      });
    • gulp-file-include 公共文件包含

      先把公共部分提取到一个单独的文件里,再把需要引入公共部分的地方写上 @@include (‘公共文件的路径’)

- gulp-csso  压缩css

- gullp-less  less语法转换

  ```
  const less = require('gulp-less');
  const csso = require('gulp-csso');
  // css任务
  // 1.less语法转换
  // 2.css代码压缩
  gulp.task('cssmin', () => {
      // 选择css目录下的所有less文件以及css文件
      gulp.src(['./src/css/*.less', './src/css/*.css'])
      // 将less语法转换为css语法
          .pipe(less())
          // 将css代码进行压缩
      .pipe(csso())
          // 将处理的结果进行输出
          .pipe(gulp.dest('dist/css'))
  });
  ```

- gulp-bable  js语法转换

- gulp-uglify  压缩混淆js

  ```
  const babel = require('gulp-babel');
  const uglify = require('gulp-uglify');
  // js任务
  // 1.es6代码转换

// 2.代码压缩
gulp.task(‘jsmin’, () => {
gulp.src(‘./src/js/*.js’)
.pipe(babel({
// 它可以判断当前代码的运行环境 将代码转换为当前运行环境所支持的代码
presets: [‘@babel/env’]
}))
.pipe(uglify())
.pipe(gulp.dest(‘dist/js’))
});
```

- browsersync  浏览器实时同步

package.json文件

作用:项目描述文件,记录当前项目信息,可使用npm init -yes/y命令生成。

node_modules文件夹的问题

Node规范将模块文件都放在node_modules这个目录

但是如果文件夹和文件过多过碎,我们要把整体文件夹拷贝给别人的时候传输速度会很慢。
复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致以免运行报错。

项目依赖

项目开发和运营上线都需要依赖的第三方包,使用npm install 包名下载的文件会默认添加到package.js文件的dependencies字段中

  • dependencies

    • npm install 下载

开发依赖

项目开发阶段需要的依赖,线上运营不需要的第三方包,称为开发依赖
使用npm install 包名 --save-dev/-D命令将包添加到devDependencies字段中

  • devDependencies

    • npm install –production 下载

package-lock.js文件的作用

锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作

Node.js异步编程

同步API:只有当前API执行完成后,才能继续执行下一个API,可以从返回值拿到API的执行结果

异步API:当前API的执行不会阻塞后续代码的执行,使用回调函数(自己定义的函数别人调用)可以获取异步API的执行结果

Promise出现的目的是解决Node.js异步编程中回调地狱(也就是后面异步API依赖当前异步API的调用,造成一层层嵌套的关系)的问题。

异步函数

异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。

async关键字

const fn = async () => {};
async function fn () {}
  1. 普通函数定义前加async关键字 普通函数变成异步函数
  2. 异步函数默认返回promise对象
  3. 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法
  4. 在异步函数内部使用throw关键字抛出程序异常
  5. 调用异步函数再链式调用then方法获取异步函数执行结果
  6. 调用异步函数再链式调用catch方法获取异步函数执行的错误信息

await关键字

  1. await关键字只能出现在异步函数中
  2. await promise await后面只能写promise对象 写其他类型的API是不不可以的
  3. await关键字可是暂停异步函数向下执行 直到promise返回结果

文章作者: XiaoQi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XiaoQi !
 上一篇
mongoDB数据库 mongoDB数据库
术语 解释说明 database 数据库,可建立多个 collection 集合,一组数据,相当于js里的数组 document 文档,一条具体的数据,相当于js里的对象 filed 字段,文档中的属性名称,相当与j
下一篇 
初识jQuery 初识jQuery
初始jQuery什么是jQueryjQuery是一个快速、简洁的javascript库,它里面封装了JavaScript常用大的功能代码,优化了DOM操作、事件处理、动画设计和Ajax交互,学习jQuery的本质就是学习调用这些函数(方法)
2020-04-10
  目录