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

京东快递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,   } })
  作者:杨博

一个和半个,这就是中韩围棋的差距所在当今的世界围棋界已经有一个共识得AI精髓者得天下。通俗一点说,就是AI附体者就能够打遍天下无敌手。AI的横空出世大大颠灭了职业高手既往的理论和招法,其实力远超最为出色的职业好手,可看电视和不看电视的宝宝,以后有啥差距?电视多大才能看快把电视关了,你今天都看两个小时了妈妈,我再看一会,一会,就十分钟,好不好嘛这样的对话相信每个家庭都不陌生,妈妈们魔高一尺,宝宝们道高一丈,撒娇卖萌撒泼打滚谎话连篇,听起来生动有趣为什么孩子不能压抑情绪?危害很大么?我讲几个梦境,你就懂了文37度暖爸在家庭教育中,父母亲必然会存在控制行为,适度的控制也是必要的。但是如果因为控制让孩子的情绪不能不敢表达,而产生了压抑,可能会对孩子造成一些不良影响,或许会是讨好知难而退最强I312100跨时空对比前几代I5,真实差距,你肯定猜不到在最近几个月的装机过程中,蜗牛很疑惑一个问题,很多小伙伴见到蜗牛推荐的是I3就要求升级I5,有的小伙伴宁愿要i510400F也不要I312100F,甚至是2000多的办公主要也要上影视助推文旅融合很多人形容文旅融合是诗和远方走到了一起。据统计,有将近三成的中国游客表示他们会在观看某档综艺节目后,去节目取景地亲身感受镜头里的风景,体验节目同款旅游路线,品尝节目同款美食。综艺节宠妻的云飞浪漫的土耳其之行告诉我们幸福就是和最爱的人在一起幸福是什么?幸福就是和最爱的人在一起,彼此滋润了生命中的每一寸时光,波澜不惊,携手天涯海角看遍日出日落,温柔了岁月。云飞和热妮娅就是一对无论是到天涯还是海角,一路同行相伴到老的神仙车友自驾游,玩的就是嗨大家好,又到了五一假期,今天我和车友一起过假期。我们的行程安排如下下午2点岔河集合拍照录视频下午4点农场烧烤BBQ下午8点广场拍摄灯光秀人均费用50元本次组织的车友都是本市的,没有云南野生菌,常见的做法好吃又安全云南又到了一年一度的试毒大会了,在云南人们已经开始在山里寻找美味的野生菌了,一年中野生菌的生长周期是很短的只有2个多月,所以野生菌也是很稀有的,很多人到云南来旅游都要吃上一口野生菌象牙山导游爆料刘小光因片酬低拒演乡爱,赵本山临时改剧本01。hr用一个词形容现在的赵家班的话,我觉得是风雨飘摇!从年初的娇娇高调宣布离开,并怒斥赵本山只手遮天,到后来的王小宝葛珊珊李琳等人在直播间吐槽工资低,再到前不久的刘小光蔡维利唐唐嫣儿童节晒女儿,小姑娘骑车声音奶音奶气,粉丝开始催生二胎6月1日,唐嫣晒出自己女儿的背影视频。视频中小小糖一身红衣红裤出镜,扎了两个可爱的丸子头。小小糖才2岁多就会骑自行车了,网友笑称是不是还在妈妈肚子里的时候受到妈妈骑马戏影响了?唐嫣国内最短直飞航线之一桂林直飞玉林发文之前,云端机长还是想澄清一下,云端机长把飞行距离几百公里,飞行时间一个小时左右的短距离航线统称为最短航线。所以云端机长的最短航线在国内有很多条。希望大家不要误会,希望大家能够理
里斯2114王睿泽20分青岛5人上双力克东阳光终结连败北京时间1月13日,202223赛季CBA常规赛,东阳光男篮对战青岛男篮。经过四节比拼,最终青岛9877战胜东阳光。双方数据青岛王洪16分8助3断王睿泽20分5板6助里斯21分141。13版本更新,吕布调整回退另寻出路,海月大幅度降温体验服上一次体验服对于吕布的改动引起了热烈的讨论,结果他就回退了,换了一种新的调整思路,因为除吕布和海月以外的调整影响都不是很大,所以这篇文章主要聊一聊吕布和海月,其他的英雄放在文末一笔零月蚀的假面开发者评述实机片段展示光荣特库摩日前分享了零月蚀的假面的新实机视频,在视频中,重制版制作人深谷丰和原版总监柴田诚为玩家展示了一下名为朧月厅的场景。零月蚀的假面将于3月9日登陆PlayStation5Xb3D国风仙侠手游推荐,2023值得微氪的仙侠手游排行榜现在已经是2023了,在众多手游中仙侠手游的玩家至少占了占了三分之一。因为仙侠手游这种题材是他国做不出来的,这是刻在我们骨子里的东西,是我们东方的文化。今天小编就给大家带来几款值得王者荣耀不吃操作和意识,只管丢技能,辅助是不是最简单的位置王者荣耀这款现象级手游,相信大家都不陌生,可以说这是一款老少皆宜的游戏。和其他游戏相比,王者荣耀确实比较简单,但是要想在王者荣耀中打上一个比较高的段位,其实并不是那么容易。众所周知传奇当年的神装有多逆天?攻3麻痹五羊第一,70躲避虎齿世间罕见装备一直都是传奇玩家之间经久不衰的话题,尤其是各个时代中的极品神装。在不同时代的玩家们记忆中,这些神装有着不尽相同的外观和属性,但无一例外的是,这些装备的属性都无比逆天,价格也是超卡普空新周边生化危机急救饮料一盒售价折合1400元卡普空正在与饮料制造商GameFlavor合作,推出基于生化危机系列的饮料产品,以庆祝该系列25周年。这款商品被称为生化危机急救饮料典藏盒,主要内容是与游戏相关的饮料和草药,包括十与母亲的关系越缺乏边界,越容易焦虑母爱可能有毒越来越多人意识到,自己成年后的性格人际关系亲密关系,甚至是工作表现和人生发展,都深受童年经历与原生家庭的影响。很多人就算常年遭受心理折磨感到痛苦不堪,也不愿意指责母亲。42岁生二胎,让我瞬间清醒的5个人生真相42岁这年,感谢上天垂怜,我顺利生下二胎,成为名副其实的高龄二胎妈妈。没有二胎前,我看到很多高龄二胎妈妈,沉浸在再次当妈妈的喜悦中,再加上身边很多二胎家庭的朋友传递给我也都是其乐融曼彻斯特联VS曼彻斯特城今日曼彻斯特德比就要来了,晚上8点30分的比赛相信大家一定不会错过。主队曼联目前的连胜状态极其出色,但上一场30大胜英甲球队,居然是90分钟拉什福德前后梅开二度。真正的锋线绝杀能力31分大败!李楠队员已经尽力了多人缺阵对我们有影响直播吧1月13日讯CBA常规赛,江苏6394惨负新疆。赛后,江苏队主教练李楠和外援德文威廉姆斯出席了新闻发布会。当谈到本场比赛时,李楠说我觉得队员已经很努力了,已经尽全力了,我们现