当前位置: 首页 > news >正文

pika开源:替代WebPack的全新JS构建工具

在过去几年中,JavaScript打包已经从一种生产环境优化手段演变成几乎所有Web App都必不可少的构建步骤。不管你喜欢与否,打包器已经给Web开发带来了巨大的复杂性,这是个不争的事实。

为什么要进行打包?

现在的JavaScript打包概念可以追溯到很早以前(大约6年前),那个时候我们通常会对JavaScript文件进行最小化处理,或者把很多JavaScript文件串成一个单独的文件,这样可以加快网页的加载速度,并解决HTTP/1.1的并行请求瓶颈问题。

那么,为什么这个优化手段会成为开发必不可少的步骤?说到这里,我们不得不提到npm。那个时候,npm正在成为最大的代码库注册中心,前端开发者都十分依赖它。唯一的问题时,如果不进行打包,Node的模块系统就无法运行在Web上。于是,Browserify、Webpack之类的现代Web打包器出现了。

复杂性综合征

现如今,如果不使用像Webpack这样的打包器,构建Web App几乎是不可能的。你可以使用create-react-app创建一个项目,但它会在node_modules目录下安装200多MB的文件,其中包含了1300多个不同的依赖项,而你可能只是为了运行“Hello World!”。

其实,想要自己开发一个JavaScript模块系统并不难,而且一些npm包也可以在没有依赖项的情况下直接在Web上运行。但可惜的是,大部分包仍然无法直接运行,可能是因为npm包的遗留依赖项或npm包的导入机制所导致的。

于是,@pika/web出现了。

GitHub链接:https://github.com/pikapkg/web

没有打包器的Web App

@pika/web通过一种新的方式来安装npm依赖项,可以让它们在浏览器中运行,即使它们也有自己的依赖项。它实际上并不是一个构建工具,也不是一个打包器,而是一个依赖项安装工具,可以让你减少对其他工具的依赖,甚至完全可以让Webpack或Parcel直接退役了。

npm install \u0026amp;\u0026amp; npx @pika/web✔ @pika/web installed web-native dependencies. [0.41s]

@pika/web会检查package.json的manifest,看看有没有导出模块的依赖项,然在在本地web_modules目录中安装这些依赖项。

安装好的包可以在浏览器中运行,因为@pika/web把每个包都打包到一个单独的.js文件中。例如,整个preact包被安装成web_modules/preact.js。

或许你会说:“它只不过是把打包隐藏了起来,在另一个地方进行打包!”

实际上,@pika/web确实是在内部利用了打包来输出Web原生的npm依赖项。

@pika/web将打包器的复杂性封装在了一个单独的安装工具中,你不想配置打包器就可以不配置。当然,你也可以继续使用你喜欢的工具:你可以继续使用Babel、TypeScript来增加开发经验,或者使用Webpack、Rollup来优化生产代码。

性能

相比其他打包器,@pika/web的依赖项安装方式(单个JS文件)在性能方面具有更大的优势:依赖项缓存。如果使用其他打包器把依赖项打包成一个大型的vendor.js,那么在更新其中一个依赖项时,用户需要重新下载整个包。而@pika/web则不同,更新其中一个依赖项并不会影响缓存中的其他依赖项。

@pika/web旨在解决打包器存在的问题,比如重复代码、冗余代码导致的首次页面加载速度变慢、升级Webpack生态系统导致的bug……

另一方面,不进行打包也不是件好事。大文件比小文件的压缩率更高,而且即使HTTP/2可以同时加载多个小文件,但浏览器在发出后续请求时仍然要解析它们。

所以,我们必须在性能、缓存效率和复杂性之间做出权衡,而这就是@pika/web存在的意义。

@pika/web使用策略

@pika/web已经彻底改变了我们的Web开发方式。以下是我们使用@pika/web开发pikapkg.com的流程,我们也希望你们在2019年开发新的Web App时也可以使用这个流程。

对于新项目,可以抛弃打包器了。使用JavaScript模块语法来写项目代码,使用@pika/web来安装npm依赖项,不需要其他工具。
根据需要来添加其他工具。如果你需要类型系统,就加入TypeScript。如果你想要使用实验性的JavaScript特性,可以加入Babel。如果你想最小化JavaScript代码,可以加入Terser。
如果你觉得有必要,并且有时间,可以试着加入一个打包器,然后进行性能测试。页面首次加载变快了吗?如果是,那就发布出去!
随着项目的增长,持续优化你的打包器配置。
如果你的项目有足够的预算,可以招一个Webpack专家。

示例项目

  • 一个简单的项目:

https://glitch.com/edit/#!/pika-web-example-simple

  • 一个Preact+HTM项目:

https://glitch.com/edit/#!/pika-web-example-preact-htm

  • 一个Electron项目,使用了Three.js:

https://github.com/br3tt/electron-three

  • 英文原文:

https://www.pikapkg.com/blog/pika-web-a-future-without-webpack

更多内容,请关注前端之巅。

\"\"

相关文章:

  • MySql批量插入与唯一索引问题
  • CF451E Devu and Flowers
  • Android之RxJava详解
  • 知道大数据却不清楚工业大数据,知识架构“欠”在哪里?
  • 些许注意事项(初学)
  • 漫话:如何给女朋友解释什么是乐观锁与悲观锁
  • koa2框架的使用与解析
  • Beaglenone读取编码器数据
  • 数据库引擎类型
  • python连接hbase
  • 函数计算新功能-----支持C#函数
  • 记一次内存溢出的分析经历
  • 求唯一一个只出现一次的数字
  • Java设计模式--装饰器模式到Java IO 流
  • 【iOS工具】快速上传ipa文件到iTunes Connect
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2018一半小结一波
  • 230. Kth Smallest Element in a BST
  • CSS 提示工具(Tooltip)
  • es的写入过程
  • Java多态
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • scrapy学习之路4(itemloder的使用)
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 简单数学运算程序(不定期更新)
  • 聊聊directory traversal attack
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深入浅出Node.js
  • 使用Swoole加速Laravel(正式环境中)
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习使用ExpressJS 4.0中的新Router
  • ionic异常记录
  • linux 淘宝开源监控工具tsar
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring第一个helloWorld
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 数据可视化之下发图实践
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #define,static,const,三种常量的区别
  • #pragma once与条件编译
  • (1)Android开发优化---------UI优化
  • (5)STL算法之复制
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (三分钟)速览传统边缘检测算子
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net反编译的九款神器
  • .NET开源项目介绍及资源推荐:数据持久层
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @ModelAttribute 注解
  • @ModelAttribute使用详解
  • @Valid和@NotNull字段校验使用