美文网首页
前端工程化(一) Node.js基础

前端工程化(一) Node.js基础

作者: 琳琳酱吖 | 来源:发表于2021-01-24 17:35 被阅读0次

    什么是前端工程化?前端工程化又有什么用呢?前端工程化就是在构建一个前端项目的时候,通过一些技术跟工具,来提升前端开发效率的过程。

    Node.js 基础

    简介

    什么是node.js?

    • node.js是除了浏览器之外,JavaScript的另一个运行环境。
    • 就像JavaScript可以在浏览器端运行一样,JavaScript也可以才node.js上运行。区别在于:Node.js是根植于操作系统上的,提供的一些操作系统交互的APIs,例如:文件操作,web服务发布等。

    node.js的作用

    • 浏览器端的JS负责与浏览器端的功能交互,Node.js负责与服务器端的功能交互
    • node.js适合用于开发前端方向的各种工具

    node.js运行方式

    • 脚本模式

    在控制台运行 node 代码路径/文件名.js
    例如:node ./nodejs/heloworld.js

    • 交互模式(适合调试代码,相当于浏览器上的控制台)

    在命令行中,node回车进入交互模式
    运行代码,console.log(‘helloworld’); 回车输入helloworld
    退出交互模式,两次ctrl+c或者输入.exit

    使用

    全局变量

    在浏览器的JS中,全局对象是window;在Node.js下,全局对象是global

    • 在交互模式下,声明的变量和创建的函数都属于global下的
      例:var a = 1; global.a //有值
    • 在脚本模式下,声明的变量和创建的函数都不属于global下的
      例:var a = 1; console.log(global.a) //返回undefined

    注意:DOM和BOM中的对象,在Node.js环境下不可使用,Node.js和浏览器端的API不相通

    全局函数

    JavaScript提供的全局函数在Node.js环境下都可用。

    • JavaScipt语言 提供的APIs
      • parseInt/parseFloat/isNaN/evel...
      • 一次性定时器 :var timer = setTimeout(回调函数,定时时间),clearTimeout(timer)
      • 周期性定时器: var timer = setInterval(回调函数,定时时间),clearInterval(timer)
    • Node.js 环境提供的APIs
      • 立即执行定时器(在事件队列的开头执行)
        var timer = setImmediate(回调函数)
        clearImmediate(timer)
      • 进程立即执行定时器(在主进程的后边执行)
        process.nextTick(回调函数)

    同步与异步

    JS 是单线程模型,代码运行时,限制执行主程序中的任务,主程序执行完后再执行事件队列。
    process.nextTick 是在主程序结束之后执行,setImmediate 则是在事件队列的头部执行

    运行顺序.PNG

    模块

    模块(包)是Node.js中具有特定功能的对象,可以分成三类

    • 内置模块(核心模块):
      • 对应web端JS的宿主对象,例如:window,location,history等
      • 随着node.js一起安装
      • 官方文档 :http://nodejs.cn/api/
    • 自定义模块:自己编写的具有一定功能的模块
      • 文件模块:单独JS文件组成的模块
      • 目录模块:多个JS文件组成在一个目录下的模块
    • 第三方模块
      • 对应web端的JS第三方库,例如jQuery,Bootstrap等
      • 使用必须先安装
      • 在Node.js中,大量的第三方模块用 npm 来管理

    内置模块

    1. console模块提供了一个简单的控制调试台,类似web浏览器提供的JavaScript控制台。
    //以表格方式展示数据
    var obj = { name: 'judy', age:'10' }
    console.table(obj)
    // 计时
    console.time('for')
     for(var i = 0;i <= 100000; i++) {
     }
    console.timeEnd('for');
    
    1. process对象是全局变量,提供有关当前Node.js进程信息并对其进行控制。不需要使用require()
    //  获取操作系统架构  x64
    console.log(process.arch)
    // 当前系统平台信息 win32
    console.log(process.platform)
    // 获取当前文件所在目录
    console.log(process.cwd())
    // 环境变量
    console.log(process.env)
    // 自定义变量
    process.env.NODE_ENV = "develop"
    console.log(process.env.NODE_ENV)
    // 获取当前进程的编号
    console.log(process.pid)
    // 杀死进程 
    process.kill(进程编号)
    

    3.path模块负责文件路径

    • ./ 表示当前路径
    • ../ 表示上一级目录
    • __dirname 返回当前文件所在的目录
    • __filename 返回当前文件的完整路径(目录+文件)
    // 需要引入模块
    const path = require('path')
    // join 用于拼接多个路径部分
    const temp = path.join(__dirname, "..")
    // 获取路径中的文件名
    console.log(path.basename(temp));
    // 获取一个路径中的目录部分
    console.log(path.dirname(temp));
    // 获取一个路径中最后的扩展名
    console.log(path.extname(temp));
    
    1. fs模块主要负责文件基本操作
    • 文件操作
    // 引入
    const fs = require("fs")
    // 写文件:清空写入
    fs.writeFile('文件路径',' 写入内容', 回调函数)
    // 读文件
    fs.readFile('文件路径', 回调函数)
    //删除文件
    fs.unlink('文件路径, 回调函数)
    // 追加写入
    fs.appendFile('文件路径', '写入内容', 回调函数)
    
    • 目录操作
    // 创建目录
    fs.mkdir("./d", (err) => {
      if(err) throw err;
    }
    // 删除目录
    fs.rmdir("./d", (err) => {
      if(err) throw err;
    }
    // 重命名目录
    fs.rename(__dirname+'/d1', __dirname+'/d2', (err) => {
      if(err) throw err;
    }
    // 读取目录
    fs.readdir(__dirname, (err,data) => {
      if(err) throw err;
      // data是数组
      data.map((d) => {
        console.log(d)
      })
    }
    
    • fs.stat 查看状态
      // 查看文件状态
      fs.stat(__dirname+"./a.txt", (err, stat) => {
        if (err) throw err;
        if (stat.isDirectory()) {
          // 判断当前文件是否是目录    
        } else if (stat.isFile()) {
          // 判断当前文件是否是普通文件
        }
      })
    
    1. http模块,我们使用Apache 或 Nginx 来搭建服务端。在Node.js中也有搭建服务器的模块,就是http模块。
     // 引入 
    const http = require("http")
    // 创建服务器
    const server = http.createServer((req, res) => {
      res.statusCode = 200
      res.setHeader('Content-Type', 'text.plain;charset=utf-8')
      res.end("hello,node.js")
    })
    // 发布web服务
    const port = 3000
    const host = 'localhost'
    server.listen(port, host, () => {
      console.log(`服务器运行在 http://${host}:${port}`)
    })
    

    自定义模块

    在自定义模块中,只有导出(exports)的属性或方法才能被外部使用,没有导出的属性或方法是模块的私有方法,只能在模块内部使用。

    // circle.js 声明的模块
    const PI = 3.14
    const perimeter = (r) => {
      return 2 * PI * r
    }
    // 模块内容导出后,才能被外部调用
    module.exports = {
      perimeter
    }
    

    module 变量代表当前模块,是一个对象,exports属性是对外的接口。加载某个模块,其实是加载该模块的module.exports属性

    模块的使用:

    // 引入模块时,需要写入引入路径,require('circle')会报错
    const circle = require("./circle")
    // 调用模块中的属性或方法
    const r = 10;
    console.log(circle.perimeter(r));
    

    注意,引入自定义模块,需要带有引入路径,否则报错

    模块加载逻辑
    模块加载逻辑.PNG
    • package.json 是目录模块的描述文件

    第三方模块

    node.js的第三方模块是由社区维护的,需要单独安装,安装需要借助npm命令

    npm

    npm是包管理工具,会随着node.js一起安装,npm可以帮助我们下载(安装)包和包的依赖

    • 默认npm镜像源是国外的,为了提高下载速度,可将npm镜像源设置为国内地址(淘宝镜像源)
    # 修改npm镜像源
    npm config set registry https://registry.npm.taobao.org
    # 查看镜像源
    npm config get registry
    
    • 全局安装
      • 命令:npm install <package-name> --global 简写npm i <package-name> -g
      • window下,全局安装的包默认存在:C:\Users\当前用户名\AppData\Roaming\npm\node_modules
      • Mac 下,全局安装的包默认存在 /usr/local/bin/lib/node_modules
    • 局部安装(安装项目包)
      1.创建项目目录
      2.进入项目目录
      3.初始化项目 npm init --yes (npm init会得到packaga.json文件)
      4.安装包
      npm install <package-name> --save (简写:npm i <package-name> -S)开发生成环境都使用
      npm install <package-name> --save-dev (简写:npm i <package-name> -D)只在开发环境使用
    1. 命令行执行
      如果包安装在当前项目中(局部安装),则命令的执行路径是当前项目下的 .\node_modules\.bin 目录下。
      # 局部安装包的执行路径
      .\node_modules\.bin\lessc input.less output.css
      
      如果包是全局安装,则命令执行的路径也是全局的
      # 全局安装包的执行路径
      lessc input.less output.css
      

    相关文章

      网友评论

          本文标题:前端工程化(一) Node.js基础

          本文链接:https://www.haomeiwen.com/subject/pxymzktx.html