node 初步 (一)

node 介 绍

node.js 的一些 '是' 与 '不是'

  • 不是一个框架, 库
  • 不是一门新的语言
  • 是一个平台
  • 是一个 JS 的运行环境(浏览器也是 JS 的运行环境)
  • 运行在 Chrome 的 V8 引擎中, 性能很高

    • 并不在浏览器沙箱中运行
    • 功能上类似C/C++
    • 能访问电脑上的资源(文件,网络等)

node.js 现阶段应用场景

  • 高性能 web 服务器

    • 单线程异步实现
    • 其他语言 Java / Python / NGINX
  • 前端构建/前端工程化(搭环境)

    • 转义( es6 -> es5, less/sass -> css)
    • 压缩, 混淆(把易读的源代码转化成几乎不可读的, 最主要的手段就是通过改变形参的名字)
    • 打包(把从入口文件开始的所有使用到的文件打包成一个文件)
  • 爬虫, 命令行工具等
  • Electron (VScode, Atom)

    • 由于没有 UI 框架, node 和浏览器结合, 利用浏览器窗口实现用户界面(VScode)

背 景

  • 常见的 输入-输出 模型

    1. 同步I/O
      当文件读取完全结束时返回内容

      • 传统方式
        一个文件完全读取执行完成后, 再读取下一个

           for(var i = 0; i < 10; i++) {
               var content = readFile(i + '.txt')
           }
      • 优化方式(C/C++)
        所有文件同时读取, 哪个先读取完, 哪个先执行
        select 函数是系统自带的一个函数, 会在所传入参数数组中的任何一个元素准备好时进行返回

           var conn1 = connect()
           var conn2 = connect()
           var conn3 = connect()
          
           while(true){
                   var readyConns = select([conn1, conn2, conn3])
                   for(var readyConn of readyConns) {
                        var data = read(readyConn)
                        var result = process(data)
                        Write(readyConn, result)
                   }
           }
      • 多线程
        多个文件在多个线程中进行
    2. 异步I/O(node.js)
      脚本在读写设备的同时继续执行, 并在任务完成时调用回调函数
      实际上是通过多个线程实现的, 只不过多线程相对隐藏, 只能够应用相应接口进行调用

      fs.readFile('a.txt', (err, data) => {
      
      })
      console.log(1)
  • 同步/异步
    同步模式中含有隐藏的等待I/O, 适用于直线控制流程序
    异步模式中的等待I/O在管控之中, 适用于非直线控制模型

node 版本号相关

  • 每年4月和每年10月发布一个大的版本号(11.x.x->12.x.x)
  • 奇数版本维护的时间相对较短(在下一个偶数号版本发布后完全停止维护)
  • 在新的偶数号版本发布后, 前一个偶数号版本会成为LTS(Long Term Service)版本,并继续维护1.5年
  • LTS版本非常稳定(API几乎不会发生变化), 并会修复漏洞

node 命令

  • 执行JS文件

    $ node hello.js(文件名)
  • 交互式控制台(REPL)

    $ node
    > 1 + 1
    2
    
    > .help // 一些常见帮助信息(break/clear/editor/exit/load/save)
    $
    
  • 命令行参数
    process.argv可以获取传递给脚本的命令行参数
    showargv.js中只包含一条console.log(process.argv)语句

    $ node showargv.js one --and two
    ["node", "/home/margin/showargv.js", "one", "--and", "two"]
  • 调试

    • 在浏览器中调试

      $ node --inspect-brk hello.js

      运行完命令,打开Chrome的控制台点击node图标即可
      brk使命令暂停在第一行,可不加

    • 在VScode中直接调试
    • ndb

模 块

node并没有在全局作用域中添加很多功能, 多数功能都是通过调用 require 函数从模块中获取的

从路径为 y 的模块中 require(x)
  1. 如果 x 是一个内置模块
    -> 直接返回内置模块
    -> 结束
  2. 如果 x 以'/'开头
    -> 将 y 设置为根目录
  3. 如果 x 以 './' 或 '../' 或 '/' 开头
    -> 加载 y + x 组合的路径
  4. 如果 x 看起来不像一个路径

    • 在当前文件夹的 node-modules 文件夹里查找名为 x 的文件夹

      • 如果此文件夹里有 package.json , 则加载 main 字段所指向的文件
      • 如果没有 package.json , 则直接加载文件夹里的 index 文件
    • 如果在当前文件夹的 node-modules 里找不到名为 x 的文件夹

      • 则在当前文件夹的父级文件夹里查找 node-modules
    • 如果 x 为 xx/yy 则加载 xx 文件夹中的 yy 文件
     chunk1 = require('lodash').chunk  // 加载了整个 lodash , 只把 chunk 读取了出来
     chunk2 = require('lodash/chunk')  // 只加载了 lodash 中的 chunk.js 文件

安装 NPM 模块

$ npm install figlet
$ npm i figlet//install和global可以缩写
$ npm i -g figlet
  • npm install : 把文件下载下来, 装到当前工作目录的node-modules文件夹里面
  • npm install --global : 全局安装, 注意全局安装并不是在所有地方都可以 require, 只能在当前文件夹中 require , 这里的指的是一个命令行工具装在全局中

你可能感兴趣的:(node.js)