Glup 和 Vite

  • Glup

    它是一个基于流的前端自动化构建工具

    1. 读取文件 src()
    2. 通过管道处理 pipe()
    3. 输出文件 dest(path,options)
      1. path 写入的文件路径
      2. options 参数 (可选)
    4. 监听文件变化,触发相应的文件流 watch(globs, options, task)
      1. globs 要监听的文件
      2. options 配置对象(可选)
      3. task执行的任务函数(可选)
    javascript 复制代码
    const gulp = require('gulp');
    const browserSync = require('browser-sync').create();
    gulp.task('scripts', function() {
      return gulp.src('src/js/**/*.js')
        .pipe(babel({ presets: ['@babel/preset-env'] }))
        .pipe(uglify())
        .pipe(gulp.dest('dist/js'))
        .pipe(browserSync.stream());
    });
    gulp.task('serve', ['build'], function() {
      browserSync.init({ //启动本地开发服务器 dist 为网站根目录
        server: './dist'
      });
      // 监听文件变化
      gulp.watch('src/js/**/*.js', ['scripts']);
    });

Glup 适合任务流式处理(文件操作)例如处理静态页面项目、SDK、文件的压缩、拷贝、编译

和Webpack 本质区别

  1. Glup 读取文件后操作的是虚拟文件对象,Webpack 是文件内容 Buffer/string
  2. Glup 不支持处理依赖之间的关系(需要手动的去告诉glup每个文件该怎么处理)
  • Rollup

    vite 构建逻辑是基于Rollup的

    1. 专注于ES 模块的静态依赖分析(需要额外插件支持 CommonJs、AMD等其他模块)
    2. Tree Shaking 更彻底(会将没有导入或者动态的依赖直接删除,反之webpack因为兼顾多模块、动态依赖会不够彻底)
    • 工作流程
      1. 解析入口
        • Rollup 从配置文件input 入口文件开始读取
        • 解析代码为AST树并遍历AST 收集import/export 分析依赖关系
      2. 构建依赖图
        • 从入口触发,根据import 路径递归加载所有的依赖模块
        • 构建出完整的模块依赖图
          • 每个模块为一个节点
          • import/export 关系是边
      3. 转换优化
        • 插件机制介入,对代码进行编译转换
        • 分析import/export, 删除未使用的依赖
        • 合并多个模块,减少包装代码
    1. 生成代码
      • 按配置的output.format 输出不同的规范(esm、cjs、 iife)
      • 代码生成阶段会重新遍历AST, 输出压缩优化后的bundle
  • Vite

    • 开发环境:利用浏览器原始的ESM,服务器按需转换

      • 工作流程
        1. 浏览器请求
        2. vite 接收请求查找对应的文件(只有被请求的文件才会进行处理,其他文件不动)
        3. 根据文件类型执行相应的插件转换
        4. 返回浏览器可执行的es 模块
        5. 浏览器解析import 语句发起新的请求
    • 生产环境: 构建依赖于Rollup

    • 热更新

      1. 启动服务器
      2. 在html 中注入HMR Client
      3. 建立ws 连接
      4. vite 监听文件变化,维护内部的模块图,记录导入导出关系
      5. 当有文件变化的时候,对发生改变的文件进行编译以及转换,
      6. 通过模块图分析影响范围
      7. vite 生成更新信息 推送消息给浏览器
      8. 浏览器只对更新的模块发起http请求,请求最新的模块代码(带时间戳,模块文件会存在缓存)
      9. 执行模块定义的回调函数 import.meta.hot.accept()
    • 与Webpack 对比

      1. 构建:webpack预编译整个项目,vite 只处理被请求的文件
      2. 编译位置: webpack服务端预先编译, vite 实时编译
      3. 输出结果:webpack打包后的bundle文件, 原生的ES 模块
      4. 模块依赖关系: webpack 构建生成的依赖图, 浏览器的ES依赖解析
相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄4 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端