切图崽的自我修养--[BUILD]构建工具思路梳理

矮脚虎
• 阅读 2059

前言

之前也是从grunt/gulp/fis/过来的,到现在的webpack,中间有些问题没怎么细想,比如明明是构建工具为什么调试总是要开启一个http服务之类的,现在就来简单梳理下思路

最原始的构建工具无非是这样:

  1. 改动了某个资源文件, 要手动运行构建命令才能重新构建,

  2. 重新构建的时候构建工具将所有资源文件重新构建一次,再合并打包.

  3. 你要手动刷新页面才能加载到到最新的构建完成的资源文件

而我们希望构建工具最好是这样:

  1. 你改动了某个资源文件,构建工具能够监听到这个变化,自动进行重新构建

  2. 构建工具重新构建的时候并不会将所有的资源文件全部构建, 而是将变化了的资源文件重新构建,再将这个变化了的资源文件和其他的资源文件合并打包

  3. 构建完成之后能够自动刷新你的调试页面(当然如果能类似ajax无刷新加载就更好了)

  4. 核心功能轻量,通过plugin来拓展其他功能,比如编译coffee/typescript/tpl/sass等


实现原理

资源文件修改自动编译

监听资源的修改实现自动编译是构建工具要实现的基本功能,其原理是
node有api能够可以监听单个资源文件的状态(fs.watch),当资源文件发生变化,能够触发回调通知node, 这也是许多基于node的构建工具实现核心. 当然强大的node社区还出了监听文件夹的node模块比如Chokidar


按需构建资源文件

  • 构建工具监听到了某个资源文件的变化,重新构建一遍这个资源文件,然后在最后打包的阶段和其他没有变化的之前已经构建好的资源文件合在一起重新打包成aio(all in one)

  • 构建工具监听到了某个资源文件的变化,重新构建一遍这个资源文件,然后在之前构建的aio中抽离出这个资源文件变化前的逻辑,填入变化后的逻辑, 连一块打包都省了,不过实现起来逻辑比较复杂.


页面自动加载新资源以方便调试

要实现这种功能,一般要在本机建立一个简单的http server,构建工具构建完成之后将文件整个放置在server目录.

并且在开发环境(dev)中,构建工具构建出来的最终的页面文件除了你的业务代码,一般还会引入一段socket的相关代码,通过socket使得client能够一直和server保持通信.比如你构建完成之后,通过127.0.0.1:port/index.html调试页面,你这个index.html中嵌入了了socket的代码(当然,生产环境(prod)不会把socket的功能打包进去的)

有了socket使得服务端和客户端保持通信连接,服务器推动客户端刷新就很容易实现了. 处理方式有两种,同步刷新异步热加载

  • 如果服务器资源发生了变化,服务器会通过socket来向客户端发送指令,客户端socket捕获到这条指令,就刷新页面来重载新的资源.

  • 如果服务器发生了变化,服务器会通过socket来向客户端发送指令,客户端socket捕获到这条指令,异步向服务器拉去新的资源,来实现无刷新异步重载.


通过plugin来拓展其他功能

绝大多数构建工具都是通过插件拓展的,就不说了


点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
矮脚虎
矮脚虎
Lv1
暮霭生深树,斜阳下小楼。
文章
3
粉丝
0
获赞
0