å ¬å¸ç¨vueè¿ç¨åçå(å¤§å ¬å¸å¾å°ç¨vue)
vueæå æappè·åçAPP对æ¯
webapp项ç®å·²ç»éè¿vue-cliæ建çèææ¶å好äºï¼ç¶åéè¿webpackæå æä¸ä¸ªé¨ç½²æ件listï¼å¦ä¸ï¼æå¼HBuliderï¼æå¼ç®å½ï¼éæ©è¿ä¸ªlistï¼é¡¹ç®å称èªå·±æ´æ¹ã
vueåuni-appçåºå«å¦ä¸ï¼uni-appå¯ä»¥éè¿æå å®ç°ä¸å¥ä»£ç å¤ç«¯è¿è¡ï¼èvueä¸è¡ãuni-appæèªå¨çæ¡æ¶é¢è½½ï¼å 载页é¢çé度æ´å¿«ï¼vue没æãuniapp使ç¨å°ç¨åºçæ ç¾ï¼vue使ç¨web端çæ ç¾ã
å¯ä»¥çå¢ï¼éè¿ç¬¬ä¸æ¹çæ··åå¼åå·¥å ·é½å¯ä»¥æè¿ä¸ªæå åæAPPã
å¨App端ï¼å¦æ使ç¨vue页é¢ï¼å使ç¨webview渲æãå¦æ使ç¨nvue页é¢ï¼nativevueç缩åï¼ï¼å使ç¨åç渲æãä¸ä¸ªAppä¸å¯ä»¥åæ¶ä½¿ç¨ä¸¤ç§é¡µé¢ï¼æ¯å¦é¦é¡µä½¿ç¨nvueï¼äºçº§é¡µä½¿ç¨vue页é¢ï¼hellouniapp示ä¾å°±æ¯å¦æ¤ã
è¿ç§æ åµåå å¦ä¸ï¼æ ¹æ®æ¥è¯¢ä¸å½ç¼ç¨ç½ä¿¡æ¯æ¾ç¤ºï¼vueçtemplateç¼è¯å¨ï¼vueå°templateç¼è¯æäºrenderfunctionï¼ä½¿å¾å¨æµè§å¨ä¸æ é解ætemplateå符串ï¼è¿å¤§å¹ 度åå°äºvueæå åçä½ç§¯ã
为ä»ä¹å¤§å ¬å¸å¾å°ç¨vue?
1ãå¦æè¿å®¶å ¬å¸åè¯ä½ ï¼ä»ä»¬å°±åªä¼ç¨Vueï¼ä½ è¦å°å¿äºï¼å 为ï¼è¿ç§å ¬å¸ä¸å®å æ¥çåç§å端å°ç½ï¼è¿äºäººæ²¡ç¨è¿å ¶å®ä»»ä½æ¡æ¶ï¼çè³è¿å¿«éå¦ä¹ ä¸é¨æ°çç¼ç¨è¯è¨é½æå°é¾ï¼ä½æ¯è¿ä¸å¦¨ç¢ä»ä»¬æèµ·é®çåºæ¥è¡è¯´å «éã
2ãä¸æ¯ä¸ç¨ï¼ä¹ä¸æ¯Vue驾é©ä¸äºï¼èæ¯Vuexä¸æ¯æä¼è§£æ¹æ¡ãVuexçOptionsAPIéç项ç®çè§æ¨¡åå¤ææ§çå¢é¿ï¼ç»´æ¤çææ¬å¢å ãé 读ææ¬ç¿»åãå没æä¸ç§å¾å¥½çé»è¾å¤ç¨æ¹å¼ãé¢æ¡å¼ä»£ç æ æ³é¿å ã
3ãå 为Vueæ¯ä¸ä¸ªåºäºJavaScriptçæ¡æ¶ï¼å®çç¹æ§å æ¬æ¡æ¶çç®åæ§ï¼æäºéæï¼ç¨æ·å好æ§ï¼è¾å°çéå¶ï¼è¿äºåå å·²ç»å¸®å©Vueä¸AngularåReactç«äºã
4ãç¨æ·ä½éªä¸å¤å¥½ä¸ç®¡å产åè¿æ¯åæå¡ï¼å硬件è¿æ¯å软件ï¼æ¯å¨äºèç½è¿æ¯ä¼ ç»è¡ä¸ï¼ææ ¸å¿æ¯æ¼çæ¯ç¨æ·ä½éªã
5ãé¨é¨ä¹é´çåè°æçä¸ï¼å 为大å项ç®ä¸æ¯ä¸ä¸¤ä¸ªäººï¼ä¸äºä¸ªäººè½å¤å®æçãä¸ä¸ªé¡¹ç®ä¹æ以称为大项ç®æ¯å¨äºå®æ¯å ¬å¸å¤§éé¨é¨åååä½ä¸ç产ç©ãä¹å°±æ¯è¯´ï¼è§£å³äºé¡¹ç®ååçé®é¢ï¼ä½¿ç¨vueåreacté½æ¯å¯ä»¥çã
6ãå½å ç¨vueå¼å项ç®çç¹å«å¤ï¼æ¯ç«ç¨vueä¸æå¿«ï¼å¼åææ¬ä½ã
çµååå°ç®¡çç³»ç»çå端ææ¯æ ---vue1ã该项ç®ä¸»è¦æ¯ä¸ä¸ªçµåçåå°ç®¡çç³»ç»ï¼å¯å®ç°ç®¡çç¨æ·è´¦å·ï¼å³ç»å½ãéåºãç¨æ·ç®¡çãæé管ççï¼åå管çï¼å³åååç±»ãåç±»åæ°ãååä¿¡æ¯ï¼è®¢åä¿¡æ¯ç以åæ°æ®ç»è®¡ã
2ãçµå管çå¹³å°ä¸»è¦ä½¿ç¨vueçWebææ¯å¯¹å ¶è¿è¡ç 究设计ä¸å®ç°ï¼æ¨å¨æ´å é«æã便æ·å°ç®¡çåå°ä¼ å ¥çæ°æ®ï¼ä¸è½å¤å¸®å©ä½¿ç¨è æ´å¥½å°è¿è¡ç¨æ·ï¼åå以å订å管çã
3ãVue.jsæ¯ä¸å¥æ建ç¨æ·çé¢çæ¸è¿å¼æ¡æ¶ï¼Vueéç¨èªä¸åä¸å¢éå¼åç设计ï¼å ¶æ ¸å¿åºåªå ³æ³¨è§å¾å±ï¼æäºä¸æï¼åæ¶vueå®å ¨æè½å驱å¨éç¨åæ件ç»ä»¶åVueçæç³»ç»æ¯æçåºå¼åçå¤æå页åºç¨ã
4ãæ³è¦å°å端Vue+åå°ç®¡çç³»ç»ä¸çº¿ï¼éè¦ä»¥ä¸æ¥éª¤ï¼å°å端Vueç¨åºæå 为éææ件ï¼ä½¿ç¨npmæyarnè¿è¡å½ä»¤ï¼npmrunbuildæyarnbuildãå¨ä½ çæå¡å¨ä¸ï¼å¯ä»¥ä½¿ç¨FTPæSCPçå·¥å ·å°éææ件ä¸ä¼ å°æå¡å¨ã
5ãuni-appï¼uni-appæ¯ä¸ä¸ªä½¿ç¨Vue.jså¼åææå端åºç¨çæ¡æ¶ï¼å¼åè ç¼åä¸å¥ä»£ç ï¼å¯åå¸å°iOSãAndroidãH以ååç§å°ç¨åºï¼å¾®ä¿¡/æ¯ä»å®/ç¾åº¦/头æ¡/QQ/éé/æ·å®ï¼ãå¿«åºç¨çå¤ä¸ªå¹³å°ã
为ä»ä¹æ²¡æ人å¼åvue转åçè¿ç§å ¬å¸çææ¯è´è´£äººå¾å¯è½æ¯ä¸ªå°ç½ï¼è³å°æ¯ä¸ªç²ç®çè·é£è ãä»èªå·±æ¯ä¸ä¼å»ç 究ææ¯çï¼å¬å«äººå¿½æ 就好äºãä½ å»å¸®è¿ç§äººåäºï¼æ³¨å®æ¯ä¸æå¡«åçå½è¿ãè¿ç§å ¬å¸ä¸å®æ²¡æè§èçå¼åæµç¨ï¼å¯è½è¿CIç³»ç»é½æ²¡æã
对äºåä¸å ¬å¸ä¸è¬èµ·æ¥ç产åé½æ¯ä¿¡æ¯ç±»ï¼æ¯å¦ç¥ä¹ãå¾®åãååç±»ï¼å¹¶æ²¡æ太å¤å¯¹åºå±ç¡¬ä»¶çä¾èµçåºç¨ï¼çios+å®å客æ·ã
å¯ä»¥çå¢ï¼éè¿ç¬¬ä¸æ¹çæ··åå¼åå·¥å ·é½å¯ä»¥æè¿ä¸ªæå åæAPPã
APPæ§è½æ¹é¢ï¼åçAppï¼è½å¤ä¸ç§»å¨ç¡¬ä»¶è®¾å¤çåºå±åè½ï¼æ¯å¦ä¸ªäººä¿¡æ¯ï¼æå头以åéåå éå¨ççãç½ç«å¶ä½çAppï¼åªè½ä½¿ç¨æéç移å¨ç¡¬ä»¶è®¾å¤åè½ã
ç¥å度ä½ãvue3ç¨ç人太å°äºæ¯ç±äºç¥å度ä½ï¼vue3æä¾äºæ´å¥½çæ§è½ï¼æ´å°çæç»å ä½ç§¯ï¼æ´å¥½çTSéæï¼ç¨äºå¤ç大è§æ¨¡ç¨ä¾çæ°APIã0çæ¬çvueï¼å¼åå¨æé¿è¾¾ä¸¤å¹´å¤ã
å¶å°ç¢°å°HBuilderè¿ä¸ªå½äººå·¥å ·ï¼è½ç´æ¥å°WebAppï¼HTML+CSS+javascriptï¼ï¼æå æåçå®åAppï¼é£å°±è¯è¯å§Webåºç¨æå æææºAppï¼éç¹èæ¥ï¼æµç ç¨åº¦åè½å®å度å¼å便æ·åº¦ãã
å¤§å ¬å¸å端ä¸è¬ç¨vueè¿æ¯react1ãæ ¹æ®ä¸åæ¡æ¶ä¼ç¹ï¼æ们å¨å®é 项ç®å¼åéåä¸ä¸è¬ä¸å°å项ç®æ们ä¼éæ©ä½¿ç¨Vueï¼å¤§å项ç®ä¼éæ©Reactã
2ãä½ä¸ºä¸ä¸ªä¸ä¸å端ï¼å»ºè®®åæå¦Vueï¼åæåå¦Reactï¼åä¹ï¼å¦æä¹åç´æ¥å¦çReactï¼åä¸è¬ä¸éè¦åå»å¦Vueäºï¼å项ç®ï¼éä¸ä¸ªå°±è¡äºã
3ãé½ç¨ãvueåreactå¨å¤§å ¬å¸ä¸é½å¾å¸¸ç¨ãå¹´Reactå·©åºäºå®ä½ä¸ºå端æ¡æ¶ä¹ççå°ä½ï¼è¿ä¸å¹´ä¸å¯ä»¥çå°å®å¨Web端å移å¨ç«¯çå¿«éæé¿ï¼åæ¶ç¨³ç¨³é¢å äºå®ç主è¦ç«äºå¯¹æAngularã
vueæ ¹æ®åççæ¬å·è¿è¡çæ¬æ§å¶1ãvuecliæ¹esçæ¬éè¿ä»¥ä¸ä¸¤ä¸ªæ¥éª¤å®æãå¸è½½å½åçæ¬ï¼ä½¿ç¨å½ä»¤npmuninstall-g@vue/cliå³å¯ã使ç¨å½ä»¤npmi-g@vue/cli@0.4å®è£ esçæ¬å³å¯ã
2ãå¨Vueè·¯ç±ç³»ç»ä¸å¯ä»¥æ¹åçæ¬å·ï¼åªéå¨é¡¹ç®çpackage.jsonæ件ä¸æ¾å°å段versionï¼ç¶åæ´æ¹å ¶å¼å³å¯ã
3ãæ¤å¤ï¼æ¶é´æ³é常æ¯ä»¥ç§ä¸ºåä½ï¼èçæ¬å·ä¸è½ä»¥ç§ä¸ºåä½ï¼å æ¤éè¦åä¸äºå¤çæè½ç¨æ¶é´æ³å½çæ¬å·ãå¦å¤ï¼ç¨æ¶é´æ³åçæ¬å·ä¸å©äºçæ¬æ§å¶åå¤ä»½ï¼å 为æ¶é´æ³å¯è½ä¼ååï¼è¿æ ·å°±ä¼å¯¹çæ¬æ§å¶äº§çå½±åã
4ãvueï¼4ï¼2vue-template-compilerï¼4ï¼ï¼æ³¨ï¼å¦ä¸æ示çæ¬å·åä¸ºæ ·ä¾ï¼å ·ä½å®ç°è¯·å°ä¼ä¼´ä»¬æ ¹æ®èªå·±ççæ¬å·å¯¹åºï¼ç¶åæ§è¡ï¼npmupdateå°±å¯ä»¥äºã
5ãçæ¬å·å¨package.jsonéæï¼å¦ææå¾ççæ¬å·å°±å®è£ ææ°çï¼æ§è¡npminstallneo-async@latestï¼ææ°çå¯è½ä¸å ¶ä»å ä¸å ¼å®¹ï¼ææ建议åpackage.jsonä¸ä¿æä¸è´ï¼ãå¦å¤installæ¶ï¼å»ºè®®ä½¿ç¨æ·å®éåï¼å¯ä»¥åèè¿ç¯æç« ã
6ãè°ç äºå¾å¤æ¡æ¶å模å¼ï¼æåèªå·±ä¸æ¼è¥¿åæåºæ¥äºè¿ä¹ä¸ä¸ªç©æãæå¡ç«¯æ¯«æ çé®ä½¿ç¨nodeï¼ä½¿ç¨typescriptå¯ä»¥ææçå¨ç¼ç åæ¶æ¥éï¼å¼ºç±»åè¯è¨åæå¡ç«¯æ¯«æ ååã
一次vue-cli4项目升级到vite的经历
背景
使用vue-cli4的项目,业务写多了之后开发运行和打包都慢了很多,源码为了提升开发体验以及更新团队技术框架,源码需要升级到更高级的源码脚手架上,两种方案:一是源码升级到vue-cli5,二是源码8哥源码升级到最新的vite。
其中第一种方案升级简单,源码经过实验,源码打包的源码速度不升反慢,这可能和项目中的源码有依赖以及业务代码有关。
第二种方案升级vite,源码经过可行性调查,源码升级到vite的源码成功率非常高,最后决定从vue-cli4升级到vite,源码这是源码一个高风险高回报的事情,因为尽管市面上已存在很多升级成功的案列,但是每个项目都不一样,我们的项目也很庞大,依赖很多,并没有%升级成功的把握。而升级成功的回报也很显而易见,开发环境几乎秒运行,开发体验得到了显著提升。
升级前后对比||vue-cli4|vite||---|---|---||开发启动时间|ms|ms||生产打包时间|s|s||打包体积|.6MB|.6MB||运行期间同一代码改动编译时间|ms|瞬时|
生产环境打包时间可能和我们项目中用到了太多vite插件有关系,但开发环境的提升非常显著。
项目状况项目中用到的Vue2,VueCli版本:4.5.,版本更新时间为.5.8,vueCli4的最后版本为4.5.(.3.),依赖的goleveldb 源码webpack版本为^4.0.0
组件库使用vant,依赖Less预处理器,通过vue.config.js配置设置了less主题色,在webpack仅支持less-loader@5版本以及对应的less版本
业务css预处理器为stylus:"^0..5",对应stylus-loader:"^3.0.2"
进行了多页打包(MPA)
使用了workbox-webpack-plugin插件配置了PWA:WorkboxWebpackPlugin
配置了多个路径映射(alias别名)
指定了文件输出路径以及hash配置
生产环境下关闭productionSourceMap以及css的sourceMap提升打包速度
proxy开启多个代理
用到了.env文件中的环境变量
按照开发规范忽略部分文件后缀以及index.js
移除了preload脚本
期望结果可以使用vite进行开发和打包
仍保留webpack打包功能(因为项目太大,不能保证升级到vite后会不会有问题,所以仍希望webpack原本功能正常运行)
准备工作升级Node版本,vite只支持node及以上,建议升级到v以上。
安装pnpm工具,pnpm作为更好的npm依赖管理工具,是目前npm和yarn的最好替代品,且有些依赖包使用npm安装时会有异常,使用pnpm安装可解决:pnpm
小项目尝试一键转换升级:wp2vite、webpack-to-vite,这两个工具都提供了一键将webpack项目转成vite的能力,但对于大中型项目,并不可靠。
开始行动1.安装必要依赖pnpm?add?vite-plugin-env-compatible?vite-plugin-html?vite?vite-plugin-vue2?--devvite-plugin-vue2是处理vue2版本代码的插件,如果项目中是vue3,安装的依赖有所不同,请参考webpack-to-vite
2.复制html到根目录,并修改 注意是复制,并只改动复制后的html,这样才不会破坏原有webpack功能。修改复制后的html,增加对应的js文件引用,注意type属性不能少!
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>多页打包(MPA),其他页面的xmlpad源码html同样操作,不同html引入对应的js即可。
3.新增vite.config.js文件,开始迁移最重要的配置部分空配置如下:
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ })4.修改环境变量环境变量主要面临两个问题:
要兼容webpack和vite的环境变量用法
解决方法:使用vite插件vite-plugin-env-compatible,让vite中可以使用webpack中读取环境变量的方式,再配合envPrefix配置,让vite可以读取到VUE_APP_开头的环境变量:
?pnpm?add?vite-plugin-env-compatible?-D?import?{ ?defineConfig?}?from?'vite'?import?envCompatible?from?'vite-plugin-env-compatible'?export?default?defineConfig({ plugins:?[?envCompatible()],envPrefix:?['VUE_APP_']?//?很重要?})?//?mian.js测试?console.log(process.env.VUE_APP_UNION_STATS)?console.log(import.meta.env.VUE_APP_UNION_STATS)两个打印都得到了正确的结果,注意:vite中默认只能读取到VITE_开头的环境变量,如果不配置envPrefix,则会导致第二个打印为undefind。
vite.config.js中不能读取到环境变量
vite.config.js是无法直接通过import.meta.env和process.env获取环境变量的,我们需要通过vite的loadEnv获取。
我们需要将vite.config.js的导出对象改为函数:
?import?{ ?defineConfig,loadEnv?}?from?'vite'?export?default?({ ?mode?})?=>?{ ?const?isPro?=?mode?===?'production'?//?我们可以通过mode直接判断当前是不是生产环境,注意mode可以在运行指令中指定:`vite?build?--mode?master`,如果没有指定,那默认打包就是production?function?getEnv(key)?{ ?//?定义获取环境变量的方法?return?loadEnv(mode,?process.cwd(),'')[key]?//?第三个参数非常重要,下面有详解?}?return?defineConfig({ ?base:?getEnv('VUE_APP_PUBLICPATH'),?//?读取环境变量?//?...忽略其他代码?})?})loadEnv有三个参数,前两个参数基本固定不变,而第三个参数默认情况下是不需要传的,只有在配置了envPrefix项,读取非VITE_开头的变量时才需要,在loadEnv源码中我们可以看到,第三个参数是prefixes:string|string[]='VITE_',也就是环境变量的前缀,默认是VITE_。
如果你的项目和我一样,读取了VUE_APP_PUBLICPATH这样非VITE_开头环境变量,就在loadEnv的第三个参数传递空字符串即可,这样就能读取到所有的环境变量了。
5.兼容commonjs代码项目中有用到commonjs规范的1001101源码依赖,比如letmd5=require('js-md5').create(),webpack是基于node开发的,支持require语法,在打包的时候webpack也会正确处理这部分代码,但在vite中不会,所以需要将这部分代码改成importmd5from'js-md5'
项目开发环境下,一些node_modules中的包也会存在commonjs的代码,我们可以通过vite的插件?vite-plugin-commonjs来实现这部分代码的转化,保证开发环境的正常运行。
pnpm?add?@originjs/vite-plugin-commonjs?--dev//?vite.config.js?忽略其他代码import?{ ?viteCommonjs?}?from?'@originjs/vite-plugin-commonjs'export?default?({ ?mode?})?=>?{ return?defineConfig({ plugins:?[//?...viteCommonjs()?//?兼容vite中的cjs导入语法]})})6.解决css预处理的问题vite内置了对主流css预处理器的支持(sass/less/stylus),项目使用预处理器时,只需要安装对应预处理依赖即可:
#?.scss?and?.sasspnpm?add?sass?-D#?.lesspnpm?add?stylus?-D#?.styl?and?.styluspnpm?add?stylus?-D比较巧的是,我们项目中用到的Stylus的@import别名的语法和vite冲突,@import'~@/public/stylus/mixins'这样的代码是会报错,一开始我找到了插件,可以帮助我们解决这个问题:vite-plugin-stylus-alias,但是都后面打包的时候发现这个插件有副作用,后面采取了其他方法解决。
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>0<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>1使用这个插件会导致无法生成sourcemap文件,在打包的时候可以看到警告:Sourcemapislikelytobeincorrect:aplugin(vite-plugin-stylus-alias)wasusedtotransformfiles,butdidn'tgenerateasourcemapforthetransformation.Consulttheplugindocumentationforhelp,鉴于插件作者已经很久没有更新,建议能改成相对路径还是直接改,如果引用地方较多,可以定义文件为全局styl文件最新解决方案:一般出现这个报错是因为插件使用了vite的transformapi转换代码,但是return值缺失导致,解决方法:复制插件代码到项目中,在插件transform函数return的结果中,返回map:null,然后再vite.config.js中引用项目中修改后的dmodce源码插件,即可完美解决,如下:文末解决bug有细说
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>2定义stylus全局文件
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>3这里需要注意,官方文档中css-preprocessoroptions写的是使用文件名拓展名作为key,stylus的文件拓展名是styl,但是我使用了stylus作为key并不会有问题,相反使用styl作为key则不生效了,后续这个地方可以留意一下。
在vite源码中,stylus和styl都进行了判断,理论上都可以使用,但目前测试的结果就是styl作为key不生效,可能源码中其他地方还能找到原因。
7.组件库按需导入和定制主题我们项目中用到的组件库是Vant2,该组件库依赖Less,以及通过配置文件来定制组件的主题,在配置中我们需要进行修改:
vue-cli中的主题配置部分如下:
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>4vite中主题配置部分如下:
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>5按需导入项目中按需导入vant组件库,组件可以成功导入,但是组件的样式缺失了,这是因为在webpack中,babel-plugin-import插件帮我们实现了组件的样式导入,在vite中使用?vite-plugin-style-import插件帮我们实现这个功能,不仅vant组件库,其他诸如element、antv等组件库也可以使用这个插件进行按需导入:
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>6<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>.修改alias别名配置,以及忽略文件后缀vite配置别名的方法和vue-cli有所不同,且没有默认的别名,都需要通过配置实现,且vite默认不能忽略文件后缀导入,我们也需要通过修改配置来实现:
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>8需要注意extensions配置的顺序,从左到右进行匹配,如果存在同名但类型不同的文件,很可能得到期望外的结果,比如同目录下存在index.js和index.vue,按上面的顺序,import'./index?会优先匹配到index.js文件。这种情况建议补全后缀进行导入。
9.配置前端跨域vite配置跨域和webpack也有出入,需要修改配置
<!--?忽略一些代码?--><body><div?id="app"></div>++?<script?type="module"?src="/src/main.js"></script>?++</body>9以上就是几种常见的跨域配置方式,webpack中的devServer改为了server,webpack的proxy中的pathRewrite改成了rewrite,并且类型成为了函数,在函数中返回请求的路径即可。
.多页打包以及打包的其他配置vite在build.rollupOptions配置多页打包,参考rollupOptions,其他配置参考文档
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ }).配置运行路径base是指项目运行在服务器的哪个路径下,一般通过从环境变量中动态获取。
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ }).配置EsLintvite中使用vite-plugin-eslint插件实现eslint的检查功能,安装过程中发现vite-plugin-eslint@1.4.0会报错,安装1.3.0版本即可。
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ })2import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ }).使用插件@vitejs/plugin-legacy兼容低版本浏览器plugin-legacy文档
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ }).配置运行指令import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ })5可以在指令中声明mode环境,这个mode在vite.config.js中可以得到,具体可以参考前面4.修改环境变量
保存运行指令npmrunserve开发环境已经可以跑起来了,但是vite的特性是你用到的页面才会进行打包,其他页面没有进行访问,是不会打包的,所以需要进行打包才能知道其他地方改造会不会有问题,打包如果有报错,再解决报错即可。
.解决报错globalisnotdefined
这个错误是在node_modules/buffer/index.js?v=ea7文件中抛出的,我查看了yarn.lock文件,依赖路径为多个vue-cli插件>webpack@4.0.0>node-libs-browser?>buffer
这个是依赖的问题,第一删除node_modules重新安装依赖。第二更换npm工具为pnpm重装依赖,如果仍不行,建议不建议webpack,删除掉webpack相关依赖。
网上还有一种做法是:在window对象上挂载global对象,可作为备选方案。
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ })6@import'~@vant/icons/src/encode-woff2.less';报错
这个错误是vant组件库中的icon组件抛出的,vite默认不能使用别名,我们在前面配置了别名,但是配置的是~@指向项目中的src目录,这样vant组件库的这个文件引用就找不到了。
issuesvant
解决方法:针对vant的这个文件,做一个别名,放到第一位,优先进行匹配:
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ })7运行vitebuild,css产生了一些警告。
警告分为两种,一是css中的属性拼写错误,诸如:color写成了colo,background写成了backgrounc,属于语法错误,根据警告提示搜索对应样式进行修改即可。
二是一些语法正确,但还不清楚为什么压缩时提示了警告:比如stylus修改scoped样式用的>>>语法,以及background?rgba(0,0,0,0.5)提示Unexpected"rgba("。
Thepackagemayhaveincorrectmain/module/exportsspecifiedinitspackage.json
这个错误是通过npminstall后运行vite指令报错的,用yarn安装一直很正常,原因是node_modules的某个包的package.json定义的main入口路径错了,所以找不到模块导入。
解决方法:针对这个模块,定义别名,指向正确的入口:
import?{ ?defineConfig?}?from?'vite'export?default?defineConfig({ })8打包后导入函数定义别名后,调用函数报错
import*asminByfrom'lodash.minby'代码报错了,而且只有在生产环境下才产生。
解决方法:暂时去掉别名,这应该和lodash的导出方式modules.export在vite中转化成ES语法的过程有关系。
importminByfrom'lodash.minby'
requireisnotdefine,通过require导入资源报错
前面在步骤5已经用了插件vite-plugin-commonjs转化common.js的代码了,require理应不会报错。
但是require导入资源算是webpack的功能,和js代码不一样,所以导入资源的代码都要进行修改:
require('./images/logo.png')改成importlogofrom'./images/logo.png'
这样的修改可以兼容webpack和vite,这是在现有项目中,改动的地方会达到上百处,非常麻烦。
vuecliåwebpackä»ä¹å ³ç³»(vuecliå@vuecli)
vueåvue-cliæ¯ä»ä¹å ³ç³»ï¼
vue-cliç¸å½äºèææ¶ï¼ç»ä½ èªå¨çæ模æ¿å·¥ç¨ï¼vue-routeræ¯vueè·¯ç±æ件ï¼æ¯æä½ å页åºç¨çï¼vue-loaderæ¯webpackä¸loaderæ件ï¼å¯ä»¥æ.vueæ件è¾åºæç»ä»¶ã
å¦ä¹ ï¼æ¯æéè¿é 读ãå¬è®²ãæèãç 究ãå®è·µçéå¾è·å¾ç¥è¯åæè½çè¿ç¨ãå¦ä¹ å为çä¹ä¸å¹¿ä¹ä¸¤ç§:
çä¹:éè¿é 读ãå¬è®²ãç 究ãè§å¯ãç解ãæ¢ç´¢ãå®éªãå®è·µçæ段è·å¾ç¥è¯ææè½çè¿è¿å²ç¨ï¼æ¯ä¸ç§ä½¿ä¸ªä½å¯ä»¥å¾å°æç»åå(ç¥è¯åæè½ï¼æ¹æ³ä¸è¿ç¨ï¼æ æä¸ä»·å¼çæ¹åååå)çè¡ä¸ºæ¹å¼ãä¾å¦éè¿å¦æ ¡æè²è·å¾ç¥è¯çè¿ç¨ã
广ä¹:æ¯äººå¨çæ´»è¿ç¨ä¸ï¼éè¿è·å¾ç»éªè产ççè¡ä¸ºæè¡ä¸ºæ½è½çç¸å¯¹æä¹ ä¸ºæ¹å¼ã
社ä¼ä¸æ»ä¼åºç°ä¸ç§å¾å¥æªçç°è±¡ï¼ä¸äºäººå´ä¸åæ¨çèæ¿å¯¹ä»ä¸å¥½ï¼å·¥èµå¾ é太ä½ä»ä¹çï¼å´å¿½ç¥äºèªå·±æ¬èº«å°±æ¯æææ£æ£ï¼æ¯«æ ä»·å¼ã
èªå¤ä»¥æ¥ï¼äººä»¬å°±ä¼è¯´çâå æ循ç¯âï¼è¿è¯çä¸åï¼ä½ ç§ä»ä¹å ï¼å°±ä¼å¾å°ä»ä¹æãè¿å°±æ¯ä¸å¥½å¥½å¦ä¹ é ¿æçåæï¼é£ä¹å¦ä¹ æä»ä¹éè¦æ§å¢ï¼
ç©ä»¥ç±»ç¦ å°ºè人以群åï¼ä»ä¹æ ·æ°´å¹³ç人ï¼å°±ä¼å¤å¨ä»ä¹æ ·çç¯å¢ä¸ãæ´ä¼æ¸æ¸æç½èªå·±æ¯ä»ä¹æ ·çè½åãäºè§£èªå·±çè½åï¼äº¤å°åæ°´å¹³çæåï¼èªå·±ä¸ªäººè½åè¶é«ï¼èªç¶æåè´¨éä¹è¶é«ã
å¨å¤§å¤æ°æ åµä¸ï¼å¦ä¹ è¶å¥½ï¼èªèº«è´ºæ¦é«ä¿®å »ä¹ä¼éçå ¶æåãåæ ·é½æ¯æé±äººï¼æ´åæ·æå¼é±è´¢åªä¼è®©äººè§å¾ä¿ï¼èçæ£æç¥è¯ç人ï¼æ°è´¨å°±ä¼å¾ä¸ä¸æ ·ã
é«ç«¯å¤§æ°çå ¬å¸ä»¥å产åæ¯ä¸ä¸ç¦»ä¸äºç¥è¯çï¼åªæå¨ç¥è¯ä¸ä¸è¾ç»å«äººï¼æå¯ä»¥å¨å«çå°æ¹ä¸è¾å«äººã
å©åçæè²è¦ä»å°æèµ·ï¼å®¶é¿ä»ä¹æ ·å©åå¾å¤§å çä¼åæä»ä¹æ ·ãåªæå°èªå·±çæ°´å¹³æåï¼æä¼æè²åºæ´å¥½çå©åãèä¸æ¯ä¸ä¸ªç®å çæµ ç人ã
å 为ææåçç¶æ¯ä¼ç»å©å带å»æ´å¤çå¨æé¿æ¹é¢çç帮å©ï¼èå¦æå©åæä¸ä¸ªææåçç¶æ¯ï¼é常ä¼å¨æªæ¥çéè·¯ä¸ï¼çæ´»å¾æ´å¥½ï¼æ´é¡ºç ã
å¦ä¹ æ¯é常çéè¦ï¼å¦ä¹ ç好åæç»å³å®æåçè´¨éãèªèº«ä¿®å »åå代æè²çæ¹é¢ï¼æ以平æ¶å¨å¦ä¹ ä¸è¦åªåã
webpackåvue-cliä¹é´æä»ä¹å ³ç³»å¢ï¼
项ç®ç¤ºä¾å°åï¼
项ç®è¿å¹¶åµè¡ç»æä¾:
ä¸è½½é¡¹ç®ä¹å
#ä¸è½½ä¾èµnpminstall#è¿è¡npmrundevä¸ãå¼åç¯å¢è¿ 轿
webpackæå ç产ç¯å¢ï¼å¤å¶æ件çé 置管çï¼å¦/public/)ä¸ä¸ªweb端åæ¡é¢ç«¯å ¬ç¨çå·¥ç¨ï¼æäºæ件ä¸éè¦æè æ æ³ç¨wekpackå缩ï¼æ¾å ¥/public/æ件夹ï¼Vueå·¥ç¨ï¼ï¼è该æ件夹ä¸ä¼ç»è¿å¤çï¼ç´æ¥å¤å¶å°ç产ç®å½ã
æ§å¶ç产å çä½ç§¯ï¼æ ¹æ®è¿è¡ç¯å¢(web||æ¡é¢ï¼ï¼çè³å®¢æ·ç«¯çæ¬ï¼æ¶å客æ·ç«¯ä½ç§¯ã
æ¯å¦/public/ä¸ææ¡é¢ç«¯æé让ç¬éè¦ç.dllï¼ä½æ¯web端ä¹ä¼æå çæåºæ¥ã
vue-cliå è£ äºwebpackï¼æ件æå å¿ ç¶æ¯è·å®æå ³ç³»ã审æ¥webpackçé ç½®ï¼
å¨output.jså æç´¢publicï¼æ¾å°æå¯è½ç¸å ³çä¸åæ项CopyPlugin
æ¥é 该æ件æ档确认å®æ£æ¯æè¦æ¾ç
æ¥é é 置项ï¼åç°ignoreå±æ§å¯ä»¥æ§å¶ä¸å»å¤å¶å¦æ¸¸åªäºèµæºå°ç®çå°
æå¼vue.config.jsæ件ï¼è¿å¯ä»¥èªå®ä¹æå é ç½®
é¦å 为äºæ´èªç±ï¼éæ©é«çº§ä¸äºçchainWebpackæ¥æ¹é ç½®
æ´ç»è »çæ§å¶è¯·ç¿»é æ件主页CopyWebpackPlugin
å¦éæ§å¶æå ä¸æäºæ件çç´æ¥å¤å¶è¿ç¨ï¼å¯ä»¥éè¿é ç½®webpackçCopyWebpackPluginæ¥è¾¾å°ç®çã
请é®ä¸ä¸ï¼vue,webpack,Node.jsä¸è æä»ä¹èç³»å¢ï¼vueæ¯ä¸ç§jsæ¡æ¶ï¼wepackæ¯æè æå å·¥å ·ï¼nodejsä¹æ¯jsåå°æ¡æ¶ï¼ä¸è å°±ç¸å½äºæ¯èæ£ä¿¡è¡¨å å¼ï¼è¡¨å 妹çå ³ç³»ï¼æ²¡æç´ç³»äº²å·®è½®å±çå ³ç³»ã
ä¸ç¯æç« è¯´æ¸ webpackãviteãvue-cliãcreate-vueçåºå«å çè¿ä¸ªè¡¨æ ¼ï¼
æ¯ä¸æ¯æäºä¸ä¸ªæ´ä½çæè§ï¼æ们åæ¥è¯¦ç»ççä¸ä¸ã
å®ç½ï¼
vue-cliæ¯Vueæ©ææ¨åºçä¸æ¬¾èææ¶ï¼ä½¿ç¨webpackå建Vue项ç®ï¼å¯ä»¥éæ©å®è£ éè¦çåç§æ件ï¼æ¯å¦VuexãVueRouterçã
vue-cliç¨äºå建vue2ç项ç®ï¼
@vue/cliç¨äºå建vue3ç项ç®ï¼å½ç¶ä¹æ¯ævue2ã
使ç¨èµ·æ¥è¿æ¯æ¯è¾ç¹ççï¼é¦å è¦å®è£ èææ¶ï¼ç¶å使ç¨vuecreatehello-worldå建项ç®ï¼å ·ä½çå°±ä¸ä»ç»äºä¸ç»é¢ã
å®ç½ï¼
create-vueæ¯Vue3çä¸ç¨èææ¶ï¼ä½¿ç¨viteå建Vue3ç项ç®ï¼ä¹å¯ä»¥éæ©å®è£ éè¦çåç§æ件ï¼ä½¿ç¨æ´ç®åã
ç¶åæ们å¯ä»¥éæ©éè¦çåç§æ件ï¼
å®ç½ï¼
使ç¨viteä¸ä» å¯ä»¥å建vueç项ç®ï¼èä¸å¯ä»¥å建reactç项ç®ï¼åªæ¯éè¦æå¨æ¸éå®è£ 第ä¸æ¹æ件ï¼æç¹éº»ç¦ã
ç®åæ¯æç模æ¿é¢è®¾å¦ä¸ï¼
å®ç½ï¼
rollupæ¯ä¸ç§æå å·¥å ·ï¼ç¹ç¹å°±æ¯ï¼æçå é常精ç®ï¼ä½ç§¯å°ã
å®ç½æ¯è±æçï¼ä¸æèµæä¹æ¯è¾å°ï¼ä¸è¿å¥½å¨å¸¸è§ç¨æ³å¯ä»¥åèviteçå®ç½ã
å°¤é¨æºªå¨ç¥ä¹çä¸æ¬¡åçï¼ï¼éæå°ï¼
webpackæ¯ä¸ä¸ªå ¨è½éæå®é¢ï¼å¥é½è½å¹²ï¼åªæ¯æç¹å¤æï¼å¯¹æ°æä¸å¤ªå好ã
Rollupæ¯åèµ·ä¹ç§ï¼æå æ´ç®æ´ã
viteærollupåæäºâå¼è¢å³é£âï¼ä¾¿äºæ°æå ¥é¨ã
create-vueåºæ¬å代äºvue-cliï¼é¤éä½ æ³å建vue2ç项ç®ã
æ以ï¼æ³å建ä¸ä¸ªvue3ç项ç®ï¼é¦écreate-vueï¼é常æ¹ä¾¿å¿«æ·ï¼å»ºç«ç项ç®ä¹å¯ä»¥ç»ä¸é£æ ¼ã
vuecliservice不是内部命令?
vue-cli-service不是内部命令或外部命令
在项目文件夹下安装依赖npminstall或cnpmi(cnpm使用前提是切换了盯腊镜像)没有成功铅让
检查项目文件夹下是否有node_model文件夹,没有则重新npminstall安装,有则删除node_model文件夹重新凯激滑安装依赖
VueCLI内网安装(禁止运行vue指令解决方案)
1、Vuecli简介:
Vuecli是一个基于Vue.js进行快速开发的完整系统,VueCLI致力于将Vue生态中的工具基础标准化。它确保了各种构建工具能够基于智能的默认配置即可平稳衔接,这样你可以专注在撰写应用上,而不必花好几天败扰去纠结配置的问题。与此同时,它也为每个工具提供了调整配置的灵活性,无需eject。
cli(@vue/cli)是一个全局安装的npm包,提供了终端里的vue命令。察好旦它可以通过vuecreate快速搭建袜纯一个新项目,或者直接通过vueserve构建新想法的原型。你也可以通过vueui通过一套图形化界面管理你的所有项目。
2、Vuecli安装
npminstall-g@vue/cli
安装之后,运行vue指令,遇到以下问题:由于公司内网执行策略限制,会禁止运行vue指令。
解决方案及步骤如下:
第一步:执行Set-ExecutionPolicyRemoteSigned更改执行策略。
第二步:如果没有权限更改全局的执行策略,加上-ScopeCurrentUser后再次更改(Set-ExecutionPolicyRemoteSigned-ScopeCurrentUser),并为ExecutionPolicy参数提供值为:RemoteSigned。
第三步:执行策略更改完成后,成功运行vue指令。
vue项目:重新安装windows系统之后,vuecli3.0脚手架项目无法运行,npm不是内部命令需要先安装nodejs网页链接
如果安装后仍然不能运行,就是自动配置环境变量失败了,需要简迟手动配置环境变量网页判咐猛链接掘桥
'vue-cli-service'不是内部或外部命令,也不是可运行的程序或批处理文件。windowns下搭建好vue环境,使用npmrunserve启动项目,报错如下
1.把项目此粗中的局扒轿node_modules文件夹删掉
2.执行命令npminstall
3.安装成功之后,再次启动项目桐肆即可
安装@vue/cli之后,'vue'不是内部或外部命令,也不是可运行的程序1.@vue/cli的安装
执行npminstall-g@vue/cli或者yarnglobaladd@vue/cli
2.@vue/cli安装完成
3.检查@vue/cli是否安装明稿派成功
执行vue--version,看到如下图的结果
4.如果提示:'vue'不是内部或外部命令,也不是可运行的程序敬辩该如何解决?
一般出现这个问题,是因为没有配置全局变量
4.1npmconfiglist查看一下npm的配置信息,如下图:
4.2找到上图红色框激贺里面的路径,看看有没有vue.cmd的文件,然后把这个路径添加的系统环境变量的path里面,如下图:
4.3重新打开cmd窗口执行vue--version,看看是否成功
Vue修改默认启动端口的几种方法
修改Vue默认启动端口有多种方法,以下为其中几种操作步骤:
首先,可以直接修改项目根目录的config文件夹中的index.js文件,找到端口配置项“port”,并将其修改为所需端口,如。
其次,可以创建一个名为vue.config.js的新文件,在项目根目录下,配置端口参数以达到修改目的。
第三种方法是直接修改vue-cli源代码。打开项目中的node_modules/@vue/cli-service/lib/commands/serve.js文件,找到相关端口配置项并修改为所需端口,如端口。
若同时设置了serve.js和vue.config.js,最终启动端口将以vue.config.js内的端口为准。
2024-12-02 04:59
2024-12-02 04:49
2024-12-02 04:27
2024-12-02 02:46
2024-12-02 02:33