城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

京东快递H5项目接入vite实战

3月27日 飞虹谷投稿
  本文介绍了如何在开发阶段将vite应用于vue2。x工程,从而提高研发的开发体验与效率。主要涉及如何兼容process变量,如何处理nodesass与dartsass冲突,以及路径别名的兼容处理等。通过这篇文章可以为读者在vite接入过程中遇到的问题提供一些解决方案,并帮助读者理清vue工程接入vite的具体思路。本文主要从整体介绍了新版会员徽章系统的设计方案以及未来规划,主要描述了等级模型的设计思路,读者可以通过本文对徽章系统的核心功能有初步的了解。01前言
  随着H5项目迭代,项目的启动时长在慢慢增长,目前H5的首次启动时长约为1分钟;且文件的更新也可能触发大范围的依赖重新打包。vite、snowpack等bundless类型的打包工具的出现就是为了解决这个问题。本文将结合实际项目(京东快递H5)实现vite打包工具的无痛接入。由于目前未考虑在正式环境中使用vite进行构建,因此接入过程中需要考虑与现有打包方式的兼容问题。02徽章产品体系
  首先解决vite需要的项目依赖,主要需要添加的项目依赖如下列出:vitevitepluginvue2:官方提供的vite插件,用于兼容vue2打包vitejspluginlegacy:用于配置需要适配的低版本浏览器vitepluginhtml:2。0。7:用于在模板文件中注入代码,注意版本高版本可能需要更改vuetemplatecompiler:vue单文件组件编译插件,要跟vue版本一致rolluppluginbabel:babel相关配置sass:css预处理语言所需基础库03模板文件index。html
  1。相比vuecli构建的项目,模板文件的位置需要更改,为了同时兼容vuecli打包与vite打包,因此需要在根目录下新增index。html。
  2。模板文件需要主动导入项目入口文件main。jsts【HTMLXML】04项目启动问题
  1。vue中deep方式覆盖深层组件样式的方式不可用,需要替换为::
  2。所有的单文件组件导入必须包含。vue扩展;
  3。style中通过~方式书写的路径需要额外的通过resolve。alias设置路径别名。【Javascript】:resolve(dirname,src)
  4。提示global不存在,需要做兼容处理,通过模板文件(index。html)在全局添加global,当然也可以通过vite的插件(vitepluginglobalpolyfill)实现global变量的兼容,使用方式可参考源代码库说明。【HTMLXML】
  5。运行时提示process不存在,vite中已经不通过process获取自定义的变量,需要使用import。meta,但是考虑到vite仅用于开发阶段,不应对项目进行破坏性兼容,因此考虑在全局自定义process。vite通过define配置自定义全局变量。【Javascript】define:{单独使用这种方式并不能在运行时获取env中设置的变量,process。env:process。env,}
  通过实现简单的命令行工具来根据当前运行环境读取配置文件来对process进行数据的补充:【Javascript】env类型文件读取constdotenvrequire(dotenv)扩展processconst{expand}require(dotenvexpand)命令行参数拆分constminimistrequire(minimist);获取环境变量functionloadEnv(mode){constbasePathresolve(dirname,。env{mode?。{mode}:})constlocalPath{basePath}。localconstloadenvPath{根据当前命令行mode读取env中的参数配置constenvdotenv。config({path:envPath,debug:process。env。DEBUG})扩展processexpand(env)}load(localPath)load(basePath)}获取命令行中的参数constparmasminimist(process。argv。slice(2))目前只考虑modeloadEnv(parmas。mode)。。。exportdefaultdefineConfig({define:{process。env:process。env,})
  6。rollup中不支持动态require打包编译,而由于H5中多平台sdk冲突问题,目前必须通过动态导入的方式避免api冲突,因此会导致浏览器报错。解决方案在模板文件中对sdkAPI做兼容处理,防止报错。
  另外有其它兼容思路,如通过import替换require,但是import为异步导入,需要配合顶层await方式才能比较优雅的实现sdk的动态导入,但是vuecli中目前没有通过配置实现顶层await的兼容。【HTMLXML】
  7。jdpandoramobile(京东物流内部组件库)组件兼容问题,组件库默认导出方式与vite打包不兼容(具体原因可以参考viteissue),解决方案是通过路径别名将jdpandoramobile路径指定为commonjs包,或者可以通过vite中resolve。mainFields配置调整包搜索的优先级顺序来解决。【Javascript】resolve:{alias:{jdpandoramobile:resolve(dirname,nodemodulesjdpandoramobiledistpandoramobile。js),},mainFields:〔main,module,jsnext:main,jsnext〕}
  a。jdpandoramobile组件库样式文件导入不生效,解决方案有两种,一种是通过配置css预处理插件配置(preprocessorOptions)将组件库样式添加为额外的全局样式,但是这种方案可能存在样式优先级的问题;第二种是方案是通过vite插件vitepluginstyleimport,实现样式的按需导入。具体配置如下:【Javascript】import{createStyleImportPlugin}fromvitepluginstyleimportcreateStyleImportPlugin({libs:〔{libraryName:jdpandoramobile,esModule:true,resolveStyle:(name){returnjdpandoramobileescomponents{name}styleindex。css},}〕}),css:{preprocessorOptions:{scss:{additionalData:import{resolve(dirname,nodemodulesjdpandoramobiledistpandoramobile。css)};}}},
  8。sassloader中nodesass与sass兼容问题(与内部组件库pandora相关),vite中依赖sass(dartsass),而原项目中依赖nodesass。当两个依赖包同时存在时,由于vuecliservice(v3。8。4)中设置了sassloader优先依赖sass(dartsass),从而导致nodesass依赖被屏蔽,在通过原有的webpack方式进行打包时会由于pandora组件库与sass(dartsass)不兼容导致打包失败。解决方案是通过调整vue。config配置,将sassloader中对nodesass的依赖优先级提高,以防止安装sass后通过vuecli打包报错。【Javascript】vuecli3。8。4defaultSassLoaderOptions。implementationrequire(sass)调整vue。configcss:{。。。loaderOptions:{。。。sassloader优先使用sass,pandorasass兼容有问题implementation:require(nodesass),}}
  05代码方面调整
  常量的导入导出在文件之间存在循环依赖报错,需将常量统一导出处理。06总结
  两种项目启动结果对比如下图:
  图1vite启动H5工程
  图2vuecli启动H5工程
  1。就结果来说vite在项目启动上确实速度很快,但是由于运行时打包的方式,首次页面交互体验卡顿明显;
  2。sdk兼容仍有待优化。【Javascript】import{defineConfig,ViteDevServer,PluginOption,createServer}fromviteimportlegacyfromvitejspluginlegacyimport{getBabelOutputPlugin}fromrolluppluginbabelimporthtmlfromvitepluginhtmlimport{createVuePlugin}fromvitepluginvue2import{createStyleImportPlugin}fromvitepluginstyleimportimport{envSwitchPlugin}import{globalPolyfill}fromvitepluginglobalpolyfillimport{green}frompicocolorsconstdotenvrequire(dotenv)constminimistrequire(minimist);const{resolve}require(path)获取环境变量functionloadEnv(mode){constbasePathresolve(dirname,。env{mode?。{mode}:})constlocalPath{basePath}。localconstloadenvPath{constenvdotenv。config({path:envPath,debug:process。env。DEBUG})process。envObject。assign({。。。process。env},env。parsed)}load(localPath)load(basePath)}constparmasminimist(process。argv。slice(2))loadEnv(parmas。mode)exportinterfacePluginConfig{envKey?:string,strGetter?:()string}https:vitejs。devconfigexportdefaultdefineConfig({base:expressvite,publicDir:public,resolve:{alias:{:resolve(dirname,src),:resolve(dirname,src),https:github。comvitejsviteissues1724issuecomment767619642vite读取的文件跟esbuild读取的文件不一致,vite读取的是commonjs,但是esbuild找到了esm类型的文件认为不需要转换,所以导致导出没有做兼容jdpandoramobile:resolve(dirname,nodemodulesjdpandoramobiledistpandoramobile。js),},用于更改包搜索的优先级具体原理见源码resolvePackageEntry方法等待新版本有config。optimizeDeps?。needsInterop配置,替换为该方案mainFields:〔main,module,jsnext:main,jsnext〕},server:{host:xxx。jd。com,https:true,port:443,open:true,},optimizeDeps:{},plugins:〔本地开发通过页面按钮动态切换项目环境https:github。comPengBoUESTCvitepluginenvswitchenvSwitchPlugin({wsProtocol:vitehmr,envs:〔prepare,development,production〕,wsPath:wss:xxx。jd。comexpressvite,root:dirname,eventName:envcheck}),globalPolyfill(),createStyleImportPlugin({libs:〔{libraryName:jdpandoramobile,esModule:true,resolveStyle:(name){returnjdpandoramobileescomponents{name}styleindex。css},}〕}),createVuePlugin({}),legacy({targets:〔defaults,notIE11〕,}),getBabelOutputPlugin({configFile:resolve(dirname,babel。config。js),}),html({inject:{injectData:{title:京东快递,},},minify:true,}),〕,css:{preprocessorOptions:{scss:{additionalData:import{resolve(dirname,nodemodulesjdpandoramobiledistpandoramobile。css)};}}},build:{outDir:dist,target:es2015,minify:terser,rollupOptions:{plugins:〔〕,},},define:{process。env:process。env,}})
  作者:杨博
投诉 评论

老年人有哪些保健常识老人生活保健常识介绍老人生活保健常识不少老年朋友不清楚,因此大病小病不间断的出现,想要战胜疾病,了解好老人生活保健常识很重要,建议老年朋友参加一些有益的培训和活动,配合医……今天真后悔今天是星期天,天空一碧如洗,妈妈答应带我去野生动物园参观。动物园里的人真多啊,像一群群候鸟在天空中飞翔,到了里面,工作人员对我说:你们不能直接去里面,里面可是很危险的!所……室内养报春花对身体有害吗报春花怎样养花开旺盛报春花是生活中常见的一种花卉,因其花开艳丽且极易成活,因而是很多人养花的第一首选。而对于新手来说怎么养好报春花便成了一大难题,那么室内养报春花对身体有害吗?报春花怎样养花开的旺……盘踞云南三百多年的大理国,是怎么被忽必烈带着蒙古大军灭掉的?头条创作挑战赛一、蒙古军为什么要远征大理公元1252年,蒙古大汗蒙哥派军攻打长江上游的四川嘉定府失败。这让蒙古企图从长江上游攻陷南宋腹地的计划流产。针对于此,……斯通欲裸签欧文!篮网犹豫不决助火箭升级控卫?马刺主帅波波维奇做梦也没有想到,他为了摆烂不惜让主力球员轮休的极端做法,依然无法帮助球队坐稳西部联盟副班长的位置,因为火箭主教练塞拉斯拥有三年的摆烂经验,尽管拥有众多天赋异禀的……美国政府政策与美国经济适应性分析与启示2017年1月21日,美国新任总统特朗普宣誓就职,美国从此进入了一个全新的时代。特朗普上任后的政策往往出乎公众的预料,这和他的经历是密不可分的。特朗普是一个性格十分鲜明的总统,……理财产品选购小贴士了解产品:重点关注产品期限、投资方向或挂钩标的、流动性等投资者在购买理财产品时,应仔细阅读理财产品说明书、合同条款等信息,充分理解理财产品的各项要素,重点关注产品期限、投……凌晨,4岁宝宝拨通电话救了妈妈一命近日湖南长沙的肖女士半夜起床给孩子冲奶粉时不小心摔倒在地动弹不得危急时刻年仅四岁半的小宝佑佑人生第一次拨通了120呼救电话救了妈……2023届四星后卫漫威北京时间7月17日,2023届四星后卫漫威艾伦(MarvelAllen)已经承诺加盟乔治城大学。MarvelAllen身高64(1米93)、体重195磅、来自佛罗里……日本进献两名公主,唐高宗宠幸后却将其关进笼子,高宗太吓人了唐朝作为当时世界上,最为鼎盛的国家之一,其疆域辽阔,经济繁荣,文化昌盛,吸引了众多国家前来学习、交流文化,便形成了万国来朝的局面。据传,日本也曾向唐高宗李治进献了两位公主……京东快递H5项目接入vite实战本文介绍了如何在开发阶段将vite应用于vue2。x工程,从而提高研发的开发体验与效率。主要涉及如何兼容process变量,如何处理nodesass与dartsass冲突,以及……过年了来,嗦碗烫粉!你也懂米粉?这是记者在前往江西采访的高铁上,听到的一位江西老表对一位广西靓仔说的话。对于江西人来说粉是粮是命是乡愁米粉是江西人生活中少……
受精造句用受精造句大全韩式新娘花苞头发型兰州第二期垃圾分类红黑榜出炉这些小区上榜排列五第22251期最新规律走势图直码我市坚决贯彻落实党中央和省委部署要求对疫情防控工难忘的回忆毫不在乎造句用毫不在乎造句大全围炉煮茶的氛围感,可能悄悄让你中毒不断提出真正解决问题的新理念新思路新办法了解ChatGPT的前世今生和未来突破溢出ATR通道往往是多头趋势拉升起爆点市场上的丰胸霜真的有用吗有没有副作用男人想要混得好,关键悟透3个人情智慧,成功近在咫尺什么老人适合打拳松下冰箱质量怎么样松下冰箱特点介绍图文延禧攻略娴妃连灭六盏灯,最后一盏是谁的?大结局时才终于明白上海车展女车主起诉特斯拉被立案刹车门求解,行车数据属于谁?电影《台儿庄战役》读后感(三篇)2022艺考生各专业艺考评分标准来了洗车液可以用什么代替(在家洗车用什么清洁剂)钢铁侠面膜是什么牌子前男友和钢铁侠的区别新公司法对于增资规定是怎样的?哈尔滨为什么留不住大学毕业生?智能营销与品牌传播创新研究

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找