▓神来棋牌A9602点com ▓拥有多年专业标准化的网络服务的经验,神来棋牌凭借对互联网产品的深耕经验及对App的持续研究,神来棋牌app已成为国内最专业、服务最好的平台App,龙城棋牌平台欢迎您!神来棋牌,神来棋牌APP,神来棋牌平台,神来棋牌注册开户,神来棋牌官方಻
当前位置:主页 > Web前端 > 正文

前端 Webpack 工程化的最佳实践

03-17 Web前端

回想在2015-2016年的时候,开发者们开始渐渐把视线从大量使用Task Runner的Grunt工具,转移到Gulp这种Pipeline形式的工具。Gulp还可以配合上众多个性化插件(如gulp-streamify),从而使得整个前端的准备工作链路,变得清晰易控,如刷新页面、代码的编译和压缩等等。自动化“流水线”工具取代了很多繁杂的手动工作,可以说,是具有跨时代意义的。之于Webpack而言,其本质是是基于“模块化”思想的一个“JS预编译”解决方案,诞生初期,和其相似的方案还有Browserify,和Webpack属于同门不同派别的还有sea.js或require.js,这二者需“在线依赖”解释器编译   时至今日,多数日常工作接触的项目,已经可以完全的舍弃Gulp了。但工作中有时还会接触一些老项目,其中Gulp的使用和维护屡见不鲜。2019年初之时,通过一个老项目(gulp 3.x + webpack 3.x)的技术升级,借机了解了gulp 4.x的动态,又不禁让人回想起gulp-browserify,和gulp-webpack(五年前发布,目前改名为webpack-stream)。所以,Webpack做为某一个垂直方向的解决方案,当然可以manaually built-in Gulp中。在拿Webpack“方案”和Gulp类“工具”去做正面比较的时候,需要明晰两者解决问题的范围和思路。如今再次回顾历史,对技术的发展演变顺序,能有一个基本客观的概念   在2017年的时候,Gulp和Webpack在用户的使用率和“将继续使用”的意向上,还不分伯仲。但从《State of Javascript 2019》 中可以看到,Webpack已经完全碾压了其它工具和类库,成为了首屈一指被大家广泛使用、讨论的Build Tool。2018年2月25日Webpack 发布了4.0.0正式版本;那是对不少项目进行了Webpack 4.10.2版本的升级;过年前后,又将部分项目升级到了4.29.0 最新版本。这一系列的“跟进式升级”中,一方面是在不断融入Webpack对于模块构建的新思路和理念,为了能够更好的适应其未来的变化(Webpack 5.x的beta版过应该不久就会面世了),另一方面是在一个好的方案中不断尝试,结合项目的基础设施优化,从而提高效能,保障产品稳定   Webpack工具虽说只是前端项目CI流程的一个小部分(构建 build),就它自身而言,所涉及到的Node知识和包依赖管理经验,是一整块技能。细节来看,里面涉及了Webpack自己的包和第三方plugin生态,还要配合恰当的babel、typescript、flow.js、eslint配置等多个生态,去处理Javascript语言本身的编译/转译。以及,正确管理本地静态资源文件和远端CDN资源文件路径(打包配置决定打包结果),涉及到了跨域知识和Node层服务配置、模板配置知识。更进一步还有,NPM众多包的版本管理等让人头疼的问题。其中琐碎细节数不胜数,当所有第三方工具正确使用的前提下,也许还有些plugin小工具,需要开发者去自研发。知识谱系之大,可见一斑   本文不描述Webpack Docs使用指南,也不描述第三方插件的使用“指北”。更多的是结合过往项目经验,记录实践得出的使用技巧,也记录一些走过的弯路所带来的问题,希望对其它众多的前端技术人能够起到一点借鉴作用。 (Package Checking List:React: 16.3.2,Babel: 7.0.0,Webpack: 4.29.0,Node: 11.8.0)   在4.x版本中的早期,CLI工具集里的命令是Webpack主包自带的,但在Webpack 4.x后期的版本,将webpack-cli作为独立包剔除出去,需要手动单独安装才可以执行tnpm run start这样的脚本命令。其次,对于开发/日常环境(dev)和预发/生产环境(prod)来说,打包的策略是截然不同的   通过压缩Javscript/CSS代码,获取更小的文件加载体积;通过包的拆解来得到更优的加载策略,从而降低load time;比较轻量的source mapping(当然,当你需要一些trace信息做日志和报警的时候是另外一番情景);线上的产品的一些个性诉求(比如,对同一份Javascript代码也许要匹配不同的样式文件)等。3. 通常评估效率维度主要有以下几个,稳重提到的数据来源主要属于前三个   如果需要DLL配置(在后面的优化部分会重点讲),还需要单独加入一个webpack.dll.js打包的配置文件。当然,dll其实也是一个普通的文件Output,我们可以在on.js文件中module.exports时,写两个区分开。通过这种不是很常见的灵活写法(Exporting multiple configurations),可以更多的去理解文件的I/O和module模块的概念   被移入到了webpack.optimization.splitChunks中。有关拆包切分和颗粒度控制,这个其实从Webpack的层面已经为我们做了很多优化,自身也是有一套基础默认的优化策略的。类比来看,React生态里面diff算法本身也是有策略机制的,更多的优化,使用者可以在这个对象里面加入回调方法,自己去细化控制   这里需要特别注意的是cacheGroups,当不明确哪些内容需要被cache时,或者是颗粒度不好把控时,这样的切分会给我们带来非常多的冗余文件。下面的代码中,定义了一个vendors对象,那么我们的output文件(不包含chunksFiles)的每一个都会生成一个cache文件。加入output的有app.bundle.js和polyfill.bundle.js,一旦加入这个vendors对象,打包的时候会额外的生成两份文件,分别是vendors-app.js和vendors-polyfill.js。虽然不用担心这两个文件内容会重新打包代码进去,里面只是放一些cache索引,但这两个文件如果在不确定要用他们来做什么的时候,cacheGroups的设置,需要重新认真去考虑   本身不在是一个webpack类下面的构造器,而是被重新命名(之前的名称因为单词拼写错误了),然后放入到新的位置,调用起来需要重新去书写:new webpack.optimize.OccurrenceOrderPlugin()   webpack在打包的时候,通常需要对文件的路径去做查找、搜索,它需要明确知道文件的引用位置和引用关系,从而能够完整的知道整个映射mapping关系。减少这方面的开销,我们可以考虑去配置alias,从而以绝对路径的写法代替大量相对路径写法。好处的话,一方面是帮助webpack更快的去定位文件位置,另一方面书写起来,也不再用被输入 ../../* 还是 ../../../* 而困扰   Webstorm寻找绝对路径:在配置里面对webpack配置项加入webpack文件路径就好,Webstorm IDE会自己找到对应的alias关系。VSCode寻找绝对路径:插件层面没有发现太好的办法,如果项目正在使用typescript,可以在tsconfig.json里面配置相关的编译项,可以达到和上面Webstorm同样的效果。大图片上传CDN   上传CDN后可以大幅减小包体积。另外,webpack也不需要再去关注那些图片的文件索引路径了。项目稍微大一些,本地图片5Mb ~ 10Mb的情况非常普遍,亟待优化   去调研这个能力,得益于一次请求层的改造。诉求是希望Token不再显示传递,而是通过塞到Header去实现。在本地开发的环境,我们通常使用jsonp去解决跨域问题,但其本质其实是在网页中嵌入一段script /,自然也就不能写入Header信息,这个和我们的初衷并不相符,无法满足诉求。所以对于这样的跨域问题,我们通过几个简单的参数配置,在请求发起和请求返回的两端,分别做了代理配置,从而“欺骗”了“源Origin”,得以解决本地开发的跨域问题   基础配置和需要的自定义配置已经有了,整个项目的构建时间有可能还是非常不理想的,当前本文提及的测试项目,大概有57s的时间,还是有很多地方没有补足的,可优化的空间非常大   第一步可以先关注下Node版本,经过测试,是对整体速度可以至少提升30%的事情,尤其是在Node V8版本到V10的时候,以下是之前在另一个项目做技术改造时记录到的数据   但是这次,在把项目直接升级到了 v 11.x 后发现,有带node-sass的项目编译构建都崩溃了。才意识到,node-sass的版本也需要相应的版本更新。也测试了Babel v 6.x 到 v 7.x 版本的升级效果,本来以为babel的大版本升级会带来显著的编译速度提高,实际上却并不理想(基本可以忽略不计)   打算开启多线程能力,去处理模块化打包里面那些本是单线程执行的 loaders 们的工作。Happypack的提升效率对整个项目的首次编译而言,效果是20%左右,比较明显。加入Happypack能力的时候,有两点需要注意   其对file-loader和url-loader的支持不好,可以考虑不加,毕竟我们项目里面图片类(最好上传CDN)的和非常规格式的文件只是小部分;这次也尝试了把ts-loader加入到多线程中,但是也出现了不少编译问题。大概率怀疑是我个人的配置问题,但过程中去看issues见到了不少ts-loader和ts生态依赖兼容性的问题。目前这个项目.ts只是少数文件,作为一种尝试,大部分文件还都是.jsx和.js,所以针对ts也先不加入Happypack能力了   首先需要借助一些工具来进行分析,如:webpack-bundle-analyzer ,通过这个工具我们可以对整个构建(用于生产,Webpack Analyse针对的build过程,不是compile)过程和结果进行数据、图形上的分析,从而得知问题具体出现在了哪里。进而得知DLL所需拆分的内容是什么。以下内容是在第一次分析时得出的   这个图片的 3532 modules和62 chunks可以看到具体的模块以及chunks划分后的情况。更加直观的我们来看下面这张图,可以看到Parsed的尺寸,入口文件(7.09MB)和主chunk(2.04MB,主要是一些首页就需要加载的node_module)的大小都很夸张,并且node_modules里面的包基本上是一一打包、整整齐齐   有了这些分析结果,对应解法的思路就很清晰了:首先要抽离常用的node_modules(这是DLL的意义),然后要逐个分析,把不被经常用到的node_module们(仅被某些页面使用,不具有公共特点)也抽出去   在做了上述DLL的抽离后其实效果已经很明显了,进一步的提升空间,可以对optimization进行了配置(用法详见官方文档)   本文大概主要介绍了一些工具衍变背景、基础的组织结构和自定义配置,以及如何通过分析工具去来做性能优化,其中很多小的细节没办法一一提到,比如我们看到加载的chunk都是hash值的时候,如何能够辨别是什么组件呢:解法是可以在路由处通过配置moduleName的方式去做   诸如此类,实在繁多。随着Webpack 5.x版本的陆续发布和众多团队使用之后,也许很多东西又会有大的改变。并且各种框架的集成已经越来越丰富,更多的解放程序员在工程化维护上的双手,我们关注工程化的演进,看看Webpack生态会给我们带来什么样的惊喜 神来棋牌 神来棋牌app 神来棋牌手机版官网 神来棋牌游戏大厅 神来棋牌官方下载 神来棋牌安卓免费下载 神来棋牌手机版 神来棋牌大全下载安装 神来棋牌手机免费下载 神来棋牌官网免费下载 手机版神来棋牌 神来棋牌安卓版下载安装 神来棋牌官方正版下载 神来棋牌app官网下载 神来棋牌安卓版 神来棋牌app最新版 神来棋牌旧版本 神来棋牌官网ios 神来棋牌我下载过的 神来棋牌官方最新 神来棋牌安卓 神来棋牌每个版本 神来棋牌下载app 神来棋牌手游官网下载 老版神来棋牌下载app 神来棋牌真人下载 神来棋牌软件大全 神来棋牌ios下载 神来棋牌ios苹果版 神来棋牌官网下载 神来棋牌下载老版本 最新版神来棋牌 神来棋牌二维码 老版神来棋牌 神来棋牌推荐 神来棋牌苹果版官方下载 神来棋牌苹果手机版下载安装 神来棋牌手机版 神来棋牌怎么下载



相关推荐:



版权保护: 本文由 主页 原创,转载请保留链接: http://www.furiku.comhttp://www.furiku.com/html/649.html