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

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

东海1号!初夏的第一场旅行,就从这里开始文旅关注山海宁德行摄霞浦XINGSHEXIAPU5月19日闽山闽水物华新山海宁德行摄霞浦2022年中国旅游日宁德分会场(霞浦)启动仪式在福宁文化公园举行。本次活动中霞浦县文旅局发布全省前列!这所大学15个本科专业就业率100,87人入职世界500强就业是最大的民生工程民心工程根基工程。2021年,复杂多变的内外部环境导致高校毕业生就业形势复杂严峻,面对如此境况,海南师范大学进一步完善毕业生就业支持体系,交出了一份满意的就业答斗罗大陆六位封号斗罗身份确定,最高95级,灵鸢斗罗战死星斗大森林猎杀大明与二明的计划还是有改动,虽说还是比比东带队,但封号斗罗的身份也有所调整。这里除了比比东之外,还出动了六名封号斗罗。其中最高级别是95级。灵鸢斗罗是原创角色,不过魂全球3大著名预言家,都对2022年做出了预言,他们的预言可信吗?提起预言家,近两年出头的可不在少数,这其中获利最大的,应该就是印度的预言家阿南德了,但因预言到了疫情的发生而爆火,一夜成为了全球最著名的预言家。但其实除了阿南德以外,还有很多靠此出17年,福建男子偷食邻居草药身亡,家属索赔124万,邻居我冤枉草乌,别名乌头五毒根,多年生草本,是一种中药药材,早在明朝时期李时珍的著作本草纲目里面就有提到,其可祛风除湿,同时,生草乌亦是一种有毒药物,其中含有的乌头碱,只需口服35mg即可致比撩骚更恶劣的是,谭副院长公然撒谎文江湖小舞高校盗号不为钱,只为群里发骚言。院长假装很清高,我看高校更搞笑。一句定场诗说罢,引出一段发生在河南郑州大学校园里的荒唐事,话说日前在河南郑州轻工业大学体育学院的工作群里,带着针对中国的杀招,拜登访问韩日,第一站直奔芯片厂如果说美国推动北约全球化,以及不断打台湾牌,只是其打压中国战略的虚招,无法对中国造成太多实质性影响的话。那么现在,拜登访问韩日时,推动建立的所谓印太经济框架,就是美国遏制中国真正的传家热播,马上还有三部大剧播出,古装悬疑总有你喜欢的国剧在这个五月迎来了一波爆发。且试天下热度未减,主打女主群像的女士的法则就已经来了,古装碟剧瞄准了三国,回到了风起陇西的年代。号称国剧天花板的的正午阳光也携着欢迎光临杀来,典型的穷舅舅说左边的女孩最漂亮,但我最终选择穿绿裙子的!哈哈哈1我赶紧看他的健康码是不是绿的?2姑娘生的貌美如花,小生心迷神离,全无虚假之意,还望海涵。3我问过我父母了,他们说当年他们选择了我。4天凉了,李白吃着香蕉和水泥。广告北京欢迎你5根2019年浙江妙龄女子终服法变换身份逃亡15年,落网时有3个孩子俗话说天网恢恢疏而不漏。人总是要为自己的过错而付出代价的。但是有时候这份代价却是如此地惨痛。2004年台州,一名叫周芳的女子,本当是在妙龄的她,却因一时冲动杀害了自己的男友。而后的创业pk打工,你喜欢哪个多些先唠叨些众所周知的。自己干风险大利润有时候高有时候低,打工就是固定稳妥些。创业成功了的基本这辈子就不愁啦,失败了的就翻翻白眼叹口气,再接再厉。打工呢个人觉得是吃不饱饿不死,安安稳稳
有一种连明星都逃不过的群,张杰侃侃而谈,谢霆锋笑得合不拢嘴近日,张杰在参加综艺节目令人心动的offer4中侃侃而谈。加油团张纯烨问及在座的各位你们有加过那种很奇怪的群吗?谢霆锋关晓彤李雪琴汪苏泷静静思考,而张杰率先发声。他表示自己之前从来酸枣仁和什么药物配对治疗失眠效果最好?酸枣仁味甘酸平。归肝胆心经,有养心补肝,宁心安神,敛汗生津之功。用于虚烦不眠,惊悸多梦,体虚多汗,津伤口渴等症。东汉张仲景用酸枣仁汤治疗虚烦不眠,酸枣仁汤也由此出名,成为了治疗失眠月活8亿完成千亿目标?战略确定后视频号提速明显近日,微盟视频号营销增长峰会上,有嘉宾分享了腾讯视频号最新数据视频号月活用户突破8亿,超前完成1000亿年度目标,原生广告日消耗量达千万级,总用户使用时长超过朋友圈总用户使用时长的孱弱之体握住坚硬的武器,优胜长存,劣汰同化天地之初,万物之始一切的起源,应是纯洁无垢,逐而衍化,岁月淌而无穷变五行蕴生,力均同一界,有清浊之分,立场之争天道统御,因果自成,世间之善恶,吾利他害,身受众生万相,承情立万物有灵哪吒S不用充电桩,家用便携式充电器怎么选?哪吒S可分为增程式汽车和纯电动汽车,两款搭配的都是三元锂电池,最大交流充电功率是7KW。增程式按电池容量可以分为43。88KWh和43。51KWh两款,纯电按电池容量可分为84。5微小的水下沙丘可能揭示火星地貌的形成科学家们对海床上形成的微小沙丘的形成进行了详细的模拟。因此,可以追踪单个沙粒在水流影响下的运动轨迹。未来,研究结果可用于描述地球和火星沙漠中巨大沙丘的长期演化。坎皮纳斯大学(巴西)火星探测器首次捕捉到火星尘暴声新华社北京12月14日电据美联社13日报道,美国国家航空航天局毅力号火星车去年在火星执行一次采样任务期间曾短暂开启麦克风,却意外录到一段经过其上空的尘暴声音。这是火星探测器首次捕捉韩国首个月球探测器12月17日将开始进入任务环月轨道据韩国国际广播电台报道,韩国科学技术信息通信部和韩国航空宇宙研究院宣布,韩国首个月球探测器DANURI将于12月17日凌晨抵达距离月球108公里的位置。预计当天凌晨2时45分许,D音视频同步原理及实现本文主要描述音视频同步原理,及常见的音视频同步方案,并以代码示例,展示如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放。内容如下1。音视频同步简单介绍2。DTS骨传导耳机是利用什么原理听歌,骨传导耳机选购推荐如果你是喜欢长期佩戴耳机但又害怕耳道难受,那么新型的骨传导耳机特别适合你,其通过骨骼震动的特殊发声原理能够有效的绕过外耳道以及耳膜,对于我们耳道来说也是起到了很大的保护作用,但还是港城大探究量子飞秒拉曼光谱技术,可用于分子化学与生物组织检测拉曼光谱技术的研究最早可追溯至1928年。当时,印度物理学家钱德拉塞卡拉文卡塔拉曼(ChandrasekharaVenkataRaman)首次在实验中观察到,光经过分子后波长发生了