0602-NodeJS

第一章 Node.js基础

1.1 Nodejs概述

  1. Nodejs简介:Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台;
  2. Nodejs功能特性:Nodejs内置的相关API可以快速搭建网络服务器,相关的功能特性如:
    • 文件读写:File System
    • 进程管理:Process
    • 网络通信:http、https

1.2 Nodejs发展历史

  • 2009年2月,Ryan Dahl在博客上宣布准备基于V8创建一个轻量级的Web服务器并提供一套库。
  • 2009年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node包,随后几个月里,有人开始使用Node开发应用。
  • 2009年11月和2010年4月,两届JSConf大会都安排了Node.js的讲座。
  • 2010年年底,Node获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node的发展。
  • 2011年7月,Node在微软的支持下发布Windows版本。

第二章 Nodejs相关工具

2.1 nvm

  1. nvm(node version manager):Nodejs的版本管理工具

  2. nvm安装

    • Linux系统安装nvm

      1
      2
      3
      4
      5
      curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
      # 或者
      wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
      # 刷新配置文件
      source .bash_profile
    • Window系统安装nvm:Github下载地址

  3. nvm命令说明

    命令 使用说明
    nvm list [available] 列出已经安装的node.js版本 - 参数available:显示可下载版本的部分列表 - 参数installed:显示已安装的版本列表
    nvm install <version> [arch] 下载安装nodejs - 参数version:选择指定版本 - 参数arch:指定安装32位或64位版本(默认为系统arch)
    nvm version 显示当前运行的nvm版本,可以简写为nvm v
    nvm on 启用node.js版本管理
    nvm off 禁用node.js版本管理
    nvm uninstall <version> 卸载指定版本的nodejs
    nvm use [version] 切换到使用指定的nodejs版本

2.2 npm

  1. npm(node package manager):nodejs的包管理工具,一般Nodejs项目的包相关信息会定义在package.json配置文件中;

  2. nodejs的包管理配置文件初始化

    • 初始化package.json

      1
      npm init -y
    • 配置文件初始化参数说明

      • name:包名。
      • version:包的版本号。
      • description:包的描述。
      • main:main 字段指定了程序的主入口文件
      • script:由脚本命令组成的hash对象,key是生命周期事件,value是要运行的命令。
      • keyword:关键字
      • author:包的作者姓名。
      • license:要指定一个许可证,让人知道使用的权利和限制的。
  3. npm命令说明

    npm命令 说明
    npm version 查看模块版本
    npm help 查看某条命令的详细帮助
    npm init 在项目中引导创建一个package.json文件
    npm install 包名 安装包
    - 选项–global = -g:表示是全局安装
    - 选项-S = –save:表示安装到dependence中
    - 选项-D = –save-dev:表示安装到DevDependence中
    npm uninstall 报名 卸载包
    - 选项–gloable = -g:表示卸载的是全局包
    npm ls 查看安装的模块
    npm outdated 检查模块是否已经过时
    npm update 把当前目录下node_modules子目录里边的对应模块更新至最新版本
    npm cache clear 清空NPM本地缓存
    npm adduser 用户登录
    npm publish 向npm仓库发布包
    npm config set proxy=http://xxx 设置代理
  4. package.json包管理说明

    • -S, –save 安装包信息将加入到dependencies(生产阶段的依赖):不要将测试或过渡性的依赖放在dependencieshash中

      1
      2
      3
      4
      // npm install gulp --save 或 npm install gulp -S
      "dependencies": {
      "gulp": "^3.9.1"
      }
    • -E, –save-exact 精确安装指定模块版本

      1
      2
      3
      4
      // npm install gulp --save-exact 或 npm install gulp -E
      "dependencies": {
      "gulp": "3.9.1"
      }
    • -D, –save-dev 安装包信息将加入到devDependencies(开发阶段的依赖):不需要在开发使用的外部测试或者文档框架,将这些附属的项目列在devDependencies中。

      1
      2
      3
      4
      // npm install gulp --save-dev 或 npm install gulp -D
      "devDependencies": {
      "gulp": "^3.9.1"
      }
    • -O, –save-optional 安装包信息将加入到optionalDependencies(可选阶段的依赖)

      1
      2
      3
      4
      // npm install gulp --save-optional 或 npm install gulp -O
      "optionalDependencies": {
      "gulp": "^3.9.1"
      }
  5. package.json中包的版本说明

    • node包的版本号规范

      • 第一部分为主版本号,变化了表示有了一个不兼容上个版本的大更改。
      • 第二部分为次版本号,变化了表示增加了新功能,并且可以向后兼容。
      • 第三部分为修订版本号,变化了表示有bug修复,并且可以向后兼容。
      • 第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有五种,分别为base、alpha、beta 、RC 、 release
    • 库中版本号说明

      • version:必须匹配某个版本
      • >version:必须大于某个版本
      • >=version:可大于或等于某个版本
      • <version:必须小于某个版本
      • <=version:可以小于或等于某个版本
      • ^version:主版本号确定,次版本号和修订版本是最新版本
      • ~version:主版本号和此版本好确定,修订版本号是最新版本
      • *****:最新版本
  6. package.json的脚本命令

2.3 nrm

  1. nrm(npm registry manager):npm的镜像源管理工具

  2. 下载nrm

    1
    npm install -g nrm
  3. nrm常用命令

    nrm命令 说明
    nrm ls 查看可选的源
    nrm use taobao 切换到taobao源
    nrm add <registry> <url> 增加定制的源
    nrm del <registry> 删除对应的源
    nrm test 测试相应源的响应时间

2.4 npx

  1. npx:帮助执行依赖包node_modules包里的二进制文件,而且不需要在命令行指定二进制文件的路径, npm5.2版本开始,就与npm捆绑在一起。
  2. npx说明:npm执行二进制文件原理:①默认情况下,首先检查路径中是否存在要执行的包(即在项目中);②如果存在,它将执行;③若不存在,意味着尚未安装该软件包,npx将安装其最新版本,然后执行它;
    • 阻止默认行为:npx [package] –no-install(告诉npx ,它应该仅执行。[package],如果之前未安装,则不安装。)

第三章 脚本命令

3.1 脚本命令介绍

  1. 什么是npm脚本
    • package.json文件里面,使用scripts字段定义脚本命令:scripts字段是一个对象。它的每一个属性,对应一段脚本。
    • 命令行下使用npm run命令,就可以执行这段脚本:这些定义在package.json里面的脚本,就称为 npm 脚本
  2. 原理:每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。
  3. npm run的四种简写形式
    • npm startnpm run start
    • npm stopnpm run stop的简写
    • npm testnpm run test的简写
    • npm restartnpm run stop && npm run restart && npm run start的简写

3.2 脚本命令基础

  1. 通配符:由于 npm 脚本就是 Shell 脚本,因为可以使用 Shell 通配符。

    1
    2
    3
    "lint": "jshint *.js"		// `*`表示任意文件名,`**`表示任意一层子目录。
    "lint": "jshint **/*.js"
    "test": "tap test/\*.js" // 如果要将通配符传入原始命令,防止被 Shell 转义,要将星号转义。
  2. 传参:向 npm 脚本传入参数,要使用--标明。

    1
    2
    3
    4
    5
    6
    7
    "script":{
    "lint": "jshint **.js",
    "lint:checkstyle": "npm run lint -- --reporter checkstyle > checkstyle.xml"
    }

    // 向上面的npm run lint命令传入参数,必须写成下面这样。
    > $ npm run lint -- --reporter checkstyle > checkstyle.xml
  3. 执行顺序:如果 npm 脚本里面需要执行多个任务,那么需要明确它们的执行顺序。

    1
    2
    npm run script1.js & npm run script2.js		// 并行执行 &
    npm run script1.js && npm run script2.js // 继发执行
  4. 钩子:npm 脚本有prepost两个钩子。举例来说,build脚本命令的钩子就是prebuildpostbuild。执行npm run build会自动按照下面的顺序执行:npm run prebuild && npm run build && npm run postbuild

    1
    2
    3
    "prebuild": "echo I run before the build script",
    "build": "cross-env NODE_ENV=production webpack",
    "postbuild": "echo I run after the build script"
  5. npm_lifecycle_event变量:返回当前正在运行的脚本名称

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const TARGET = process.env.npm_lifecycle_event;

    if (TARGET === 'test') {
    console.log(`Running the test task!`);
    }

    if (TARGET === 'pretest') {
    console.log(`Running the pretest task!`);
    }

    if (TARGET === 'posttest') {
    console.log(`Running the posttest task!`);
    }

3.3 脚本变量

  1. 脚本变量:npm 脚本有一个非常强大的功能,就是可以使用 npm 的内部变量。通过npm_package_前缀,npm 脚本可以拿到package.json里面的字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    "name": "foo",
    "version": "1.2.5",
    "scripts": {
    "view": "node view.js"
    },
    "obj":{
    "name":"test"
    }
    }

    > process.env.npm_package_name // foo
    > process.env.npm_package_obj_name // test
  2. NODE_ENV环境变量:通常这个变量用来区分开发与生产环境,加载不同的配置。

    • 配置:node中有全局变量process表示当前node进程,process.env包含着关于系统环境的信息。但是process.env中并不存在NODE_ENV这个东西,NODE_ENV只是一个用户自定义的变量,当我们在服务启动时配置NODE_ENV,或在代码中给process.env.NODE_ENV赋值,js便能通过process.env.NODE_ENV获取信息。
      著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

      1
      2
      3
      4
      5
      "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "start": "NODE_ENV=production node index.js"
      },
      > process.env.NODE_ENV // production
    • Windows与Linux兼容性处理:跨平台方案,第三方插件cross-env:windows不支持NODE_ENV=development的设置方式。

      • 安装cross-env

        1
        npm install cross-env --save-dev
      • 跨平台兼容性配置

        1
        2
        3
        4
        "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "cross-env NODE_ENV=production node index.js"
        },
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2022 xiaoliuxuesheng
  • PV: UV:

老板,来一杯Java

支付宝
微信