范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  本文介绍了如何在开发阶段将vite应用于vue 2.x 工程,从而提高研发的开发体验与效率。主要涉及如何兼容process变量,如何处理 node-sass 与 dart-sass冲突,以及路径别名的兼容处理等。通过这篇文章可以为读者在vite接入过程中遇到的问题提供一些解决方案, 并帮助读者理清vue工程接入vite的具体思路。本文主要从整体介绍了新版会员徽章系统的设计方案以及未来规划,主要描述了等级模型的设计思路,读者可以通过本文对徽章系统的核心功能有初步的了解。01前言
  随着H5 项目迭代,项目的启动时长在慢慢增长,目前H5的首次启动时长约为 1分钟;且文件的更新也可能触发大范围的依赖重新打包。vite、snowpack等bundless类型的打包工具的出现就是为了解决这个问题。本文将结合实际项目(京东快递H5)实现 vite 打包工具的无痛接入。由于目前未考虑在正式环境中使用vite进行构建,因此接入过程中需要考虑与现有打包方式的兼容问题。  02徽章产品体系
  首先解决vite 需要的项目依赖,主要需要添加的项目依赖如下列出:  vite  vite-plugin-vue2 :官方提供的vite插件,用于兼容 vue2打包  @vitejs/plugin-legacy: 用于配置需要适配的低版本浏览器  vite-plugin-html: "^2.0.7":用于在模板文件中注入代码, 注意版本 高版本可能需要更改  vue-template-compiler:vue单文件组件编译插件,要跟  vue版本 一致  @rollup/plugin-babel: babel 相关配置  sass:css预处理语言所需基础库  03模板文件index.html
  1.相比 vue-cli构建的项目,模板文件的位置需要更改,为了同时兼容 vue-cli 打包与vite打包,因此需要在根目录下新增  index.html。
  2.模板文件需要主动导入项目入口文件 main.js/ts  【HTML/XML】 04项目启动问题
  1. vue 中 /deep/ 方式覆盖深层组件样式的方式不可用,需要替换为 ::v-deep;
  2.所有的单文件组件导入必须包含 .vue 扩展;
  3.style 中 通过 ~@ 方式书写的路径需要额外的通过 resolve.alias 设置路径别名。  【Javascript】      "~@": resolve(__dirname, "src")
  4.提示 global 不存在,需要做兼容处理,通过模板文件(index.html)在全局添加 global,当然也可以通过vite的插件( vite-plugin-global-polyfill)实现 global 变量的兼容,使用方式可参考源代码库说明。  【HTML/XML】
  5. 运行时提示 process 不存在,vite 中已经不通过 process 获取自定义的变量,需要使用 import.meta,但是考虑到 vite 仅用于开发阶段,不应对项目进行破坏性兼容,因此考虑在全局自定义 process。vite 通过 define 配置自定义全局变量。  【Javascript】 define: { // 单独使用这种方式 并不能在运行时获取 env 中设置的变量,     "process.env": process.env, }
  通过实现简单的命令行工具来根据当前运行环境读取配置文件来对 process 进行数据的补充:  【Javascript】 // env 类型文件读取const dotenv = require("dotenv") // 扩展 process    const { expand } = require("dotenv-expand") // 命令行参数拆分    const minimist = require("minimist"); // 获取环境变量 function loadEnv (mode) {    const basePath = resolve(__dirname, `.env${mode ? `.${mode}` : ``}`)    const localPath = `${basePath}.local`      const load = envPath => { // 根据 当前 命令行 mode 读取 env 中的参数配置      const env = dotenv.config({ path: envPath, debug: process.env.DEBUG }) // 扩展 process      expand(env)   }      load(localPath)    load(basePath) } // 获取命令行中的 参数    const parmas = minimist(process.argv.slice(2)) // 目前只考虑 mode    loadEnv(parmas.mode)   // ...   export default defineConfig({      define: {         "process.env": process.env, })
  6. rollup 中不支持动态require 打包编译,而由于H5 中多平台sdk 冲突问题,目前必须通过动态导入的方式避免 api 冲突,因此会导致浏览器报错。解决方案在模板文件中对sdk API 做兼容处理,防止报错。
  另外有其它兼容思路,如通过 import 替换 require,但是 import 为异步导入,需要配合顶层await 方式才能比较优雅的实现sdk 的动态导入,但是vue-cli 中目前没有通过配置实现顶层await 的兼容。  【HTML/XML】
  7. @jd/pandora-mobile (京东物流内部组件库)组件兼容问题,组件库默认导出方式与 vite 打包不兼容(具体原因可以参考 vite issue),解决方案是通过路径别名将 @jd/pandora-mobile路径指定为 commonjs 包,或者可以通过vite中 resolve.mainFields 配置调整包搜索的优先级顺序来解决。  【Javascript】   resolve: {     alias: {        "@jd/pandora-mobile": resolve(__dirname, "node_modules/@jd/pandora-mobile/dist/pandora-mobile.js"),     },    // mainFields: ["main", "module", "jsnext:main", "jsnext"] }
  a. @jd/pandora-mobile 组件库样式文件导入不生效,解决方案有两种,一种是通过配置 css 预处理插件配置(preprocessorOptions)将组件库样式添加为额外的全局样式,但是这种方案可能存在样式优先级的问题;第二种是方案是通过 vite 插件 vite-plugin-style-import,实现样式的按需导入。具体配置如下:  【Javascript】      import { createStyleImportPlugin } from "vite-plugin-style-import"         createStyleImportPlugin({           libs: [{             libraryName: "@jd/pandora-mobile",             esModule: true,             resolveStyle: (name) => {                return `@jd/pandora-mobile/es/components/${name}/style/index.css`       },     }]    }),   //css: {   //  preprocessorOptions: {   //    scss: {   //      additionalData: `@import "${resolve(__dirname, "node_modules/@jd/pandora-mobile/dist/pandora-mobile.css")}";`   //    }   //  }   //},
  8. sass-loader 中 node-sass 与 sass 兼容问题(与内部组件库pandora相关),vite中依赖sass(dart-sass),而原项目中依赖node-sass。当两个依赖包同时存在时,由于 @vue/cli-service(v3.8.4)中设置了 sass-loader 优先依赖 sass(dart-sass),从而导致node-sass依赖被屏蔽,在通过原有的webpack方式进行打包时会由于 pandora 组件库与 sass(dart-sass) 不兼容导致打包失败。解决方案是通过调整 vue.config 配置,将sass-loader 中对 node-sass 的依赖优先级提高,以防止安装 sass 后通过 vue-cli 打包报错。  【Javascript】 // vue-cli 3.8.4 defaultSassLoaderOptions.implementation = require("sass")   // 调整 vue.config css: {     // ...     loaderOptions: {        // ...       // sass-loader 优先 使用 sass , pandora sass 兼容有问题       implementation: require("node-sass"),     } }
  05代码方面调整
  常量的导入导出在文件之间存在循环依赖报错,需将常量统一导出处理。  06总结
  两种项目启动结果对比如下图:
  图1 vite 启动H5工程
  图2 vue-cli 启动H5工程
  1. 就结果来说 vite 在项目启动上确实速度很快,但是由于运行时打包的方式,首次页面交互体验卡顿明显;
  2. sdk 兼容仍有待优化。  【Javascript】 import { defineConfig, ViteDevServer, PluginOption, createServer } from "vite"import legacy from "@vitejs/plugin-legacy" import { getBabelOutputPlugin } from "@rollup/plugin-babel" import html from "vite-plugin-html" import { createVuePlugin } from "vite-plugin-vue2" import { createStyleImportPlugin } from "vite-plugin-style-import" import { envSwitchPlugin } from "vite-plugin-env-switch"; import { globalPolyfill } from "vite-plugin-global-polyfill" import { green } from "picocolors"   const dotenv = require("dotenv") const minimist = require("minimist"); const { resolve } = require("path") // 获取环境变量 function loadEnv (mode) {   const basePath = resolve(__dirname, `.env${mode ? `.${mode}` : ``}`)   const localPath = `${basePath}.local`     const load = envPath => {     const env = dotenv.config({ path: envPath, debug: process.env.DEBUG })     process.env = Object.assign({...process.env}, env.parsed)   }     load(localPath)   load(basePath) } const parmas = minimist(process.argv.slice(2))   loadEnv(parmas.mode)   export interface PluginConfig {   envKey?: string,   strGetter?: () => string }   // https://vitejs.dev/config/ export default defineConfig({   base: "/express-vite/",   publicDir: "public",   resolve: {     alias: {       "@": resolve(__dirname, "src"),       "~@": resolve(__dirname, "src"),       // https://github.com/vitejs/vite/issues/1724#issuecomment-767619642       // vite 读取的文件 跟 esbuild 读取的文件不一致, vite 读取的 是 commonjs,但是 esbuild 找到了 esm 类型的文件认为 不需要转换,所以导致导出没有做兼容       // "@jd/pandora-mobile": resolve(__dirname, "node_modules/@jd/pandora-mobile/dist/pandora-mobile.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.com/PengBoUESTC/vite-plugin-env-switch     envSwitchPlugin({       wsProtocol: "vite-hmr",       envs: ["prepare", "development", "production"],       wsPath: "wss://xxx.jd.com/express-vite/",       root: __dirname,       eventName: "env-check"     }),     globalPolyfill(),     createStyleImportPlugin({       libs: [{         libraryName: "@jd/pandora-mobile",         esModule: true,         resolveStyle: (name) => {           return `@jd/pandora-mobile/es/components/${name}/style/index.css`         },       }]     }),     createVuePlugin({}),     legacy({       targets: ["defaults", "not IE 11"],     }),     getBabelOutputPlugin({       configFile: resolve(__dirname, "babel.config.js"),     }),     html({       inject: {         injectData: {           title: "京东快递",         },       },       minify: true,     }),   ],   css: {     preprocessorOptions: {       // scss: {       //   additionalData: `@import "${resolve(__dirname, "node_modules/@jd/pandora-mobile/dist/pandora-mobile.css")}";`       // }     }   },     build: {     outDir: "dist",     target: "es2015",     minify: "terser",     rollupOptions: {       plugins: [       ],     },   },   define: {     "process.env": process.env,   } })
  作者:杨博

宝岛七十余年经济崛起,大陆5万亿美元的财富,被蒋介石转移台湾自古以来,台湾就是中国神圣领土不可分割的一部分。中国台湾地区,是指台湾当局控制下的台湾省(包括台湾本岛与兰屿绿岛钓鱼岛等附属岛屿及澎湖列岛),以及福建省的金门马祖乌丘等岛屿,陆地总小伙揭密卡车榴莲套路,花130被骗65元,这套路谁能想到?你没想到吧,继不良摊贩的吸星大法骗局后,现在又出现了一种卡车榴莲套路,以前的套路一般是输入单价的时候往左移动一两个小数点,就能像武侠小说里的吸星大法一样,额外的多收你一笔钱。最近,美货币政策作祟拉美国家经济面临严峻挑战新华社墨西哥城7月28日电(国际观察)美货币政策作祟拉美国家经济面临严峻挑战新华社记者赵凯王钟毅近期公布的一系列数据显示,巴西阿根廷等拉美主要经济体经济今年上半年实现增长,但增速与盘点娱乐圈里奶奶年纪才生娃的女星,你喜欢哪一个?娱乐圈里不少女星年过40才生孩子。今天就为大家盘点几位。伊能静今年,伊能静与秦昊迎来爱情结晶,母女平安,这是伊能静第二次生孩子。此时已经47岁了,风险蛮大的。贾静雯贾静雯离开豪门后面对未来,考生和大学谁更尴尬?冷不丁,我惊奇地发现大学招生,也和房地产市场一样,成了买方市场了。这不,作为江西省内为数不多的一本院校景德镇陶瓷大学,在省内投放1210个招生指标,居然只招到147人!降20分补录看到片名别急着划走,这部豆瓣9。1分的纪实剧,值得上热搜这部剧开头就很刀,一开始就交代了她的结局。她的人生定格在30岁的那一年。可即便知道了结局,还是让人忍不住往下看。这部大山的女儿改编自原百坭村第一书记,黄文秀的真人真事。她还是201胡锡进台海伴飞论惊动美媒,却遭平台威胁,要求删除言论相信这几天大家一定跟小编一样,无论打开哪个社交平台,都能看到此类消息。环球球日报特约评论员胡锡进,这几天更是连发好几条博文点评此事。自25号开始,胡锡进就曾发文。此次是佩洛西挑衅在合肥U15女足勇夺第十五届安徽省运会决赛金牌今天,第十五届安徽省运会青少部女子组U15和U17组决赛阶段的比赛在凤阳奥体中心落下帷幕。上午率先结束的U17女子组冠军争夺战,蚌埠女足20击败淮南女足摘得本次省运会青少部足球赛首当一个人开始喜欢独来独往,你知道意味着什么吗?图源自网络侵权请联系删除现代人的社交方式越来越丰富,相隔千万里的人通过视频电话,转眼就可以出现在眼前。可是人们的距离却仿佛越来越远,很多人渐渐不再愿意和周围的人打交道,他们更愿意与大学生买空调自己享用,只因室友不均摊费用,被几个室友孤立2022高考已经结束,多地本科一批录取工作结束,陆续收到录取通知书的考生,心里的一块石头总算落地了,身份变成了准大一新生,暑假终于能玩个痛快了。对于准大一新生来说,大学生活无比美好长津湖夺百花最佳影片张译袁泉摘最佳男女主电影频道主持人蓝羽电影人吴刚邓超佟丽娅1905电影网专稿花开江城,光影未来。7月30日晚,第36届大众电影百花奖颁奖典礼在武汉举行。从全国各地选拔而出的101位观众评委组成终评评选
爱情公寓林宛瑜扮演者近照,和好友聚会吃快餐,美丽依旧仿若冻龄近日,爱情公寓林宛瑜扮演者赵霁分享近照,引发网友热议。她身穿白色衬衫外搭黑色针织马甲,扎着低低的马尾,珍珠项链从领子里露出来,学生气十足,整个人的状态特别好。照片中的桌子上摆着还没霜花店侍卫与王妃之间上演的美丽而危险的有关爱情与背叛的故事刚看完这部片子,说实在的,感觉就像是一部披着华丽外衣的三级片。有关同性恋,有关背叛,有关惩罚。故事的脉络很清晰,纵使有转折点,也好似在平铺直叙中完成镜头的切换一样,很自然的就跳到另总金额超192亿元在这场推介会上重庆31个招商引资项目达成签约招商引资项目签约仪式。主办方供图华龙网新重客户端讯(吴礼霜)今(3)日,文化和旅游部产业项目服务平台第三十期精品项目交流对接活动暨重庆市文化和旅游产业重点项目推介会在重庆沙坪坝举行紫光汇智与重庆移动荣昌分公司昱澄网安达成战略合作2月28日,紫光汇智与中国移动通信集团重庆有限公司荣昌分公司(以下简称重庆移动荣昌分公司)重庆昱澄链安网络安全技术有限公司(以下简称昱澄网安)联合签署战略合作协议,合力打造新型市域重庆坐稳第二,青岛落后东莞,2022中国新一线城市排名2022年过去了,中国众多城市的步伐已经越来越紧密,尤其是城乡区域之间的发展,变得十分抢眼!当然,更重要的是中国的总体经济在不断提高,全国GDP已经达到了1210207亿元。放在国两名重庆籍球员入选首发2023年CUBAL全明星赛将在重庆举行全明星赛好事多磨2023年CUBAL全明星之夜,将于3月4日在重庆南岸乐动力江南体育中心(原江南体育馆)举办。还是在大麦网购买球票。今年全明星赛规则增加了女子3v3环节女子3v3也全国越野滑雪冠军赛重庆队在这个项目上夺冠了!比赛现场。重庆市冬季运动管理中心供图华龙网新重庆客户端讯(邱小雅)3月2日,重庆市越野滑雪队健儿王强秦海洋作为搭档参与了20222023全国越野滑雪冠军赛男子团体短距离传统技术项目盈盈有钱批量上线高炮,借道哈啰出行等平台放贷,利率超73盈盈有钱批量上线高炮现金贷,借道哈啰出行等三方平台放贷,利率超73开甲财经(IDkaijiacaijing)注意到,2022年开始,在监管打压后销声匿迹数年的现金贷高炮贷正在重新活春暖花开,我们相约滕王阁滕王阁,相信大家都不陌生。落霞与孤鹜齐飞,秋水共长天一色的美景吸引了全国各地游客的到来。滕王阁因初唐诗人王勃所作的滕王阁序而闻名于世,其与湖南岳阳楼湖北黄鹤楼并称为江南三大名楼。目太原人!攻略拿好!在山西这样过春天在山西过春天风云雷电几场细雨润物春天总是匆匆还未来得及看桃红柳绿一切就已经结束在这最易虚度的春光里早早收拾行装吧春天的山西哪里最美春天的山西何时最美桃花春红太匆匆水光潋滟何时休星空京津冀人力资源服务产业园开园已入驻34家机构新京报讯(记者耿子叶)3月3日,位于燕郊的京津冀(河北三河)人力资源服务产业园正式开园。据悉,该产业园是国内首个三地共建以京津冀命名的区域级产业园,总面积4。2万平方米,可容纳50