写一个基于qiankun微前端的Vue专用插件本项目的目的是写一个基于qiankun的Vue专用插件qiankun的微前端框架,方便在这里使用Vue项目。一开始想用js写。但是配合目前第三方类库的开发,必须要考虑通用性。如果是用js写的,如果使用的项目是typescriptvue项目,会遇到缺少类型定义文件的问题。所以用ts开发。这样,声明文件的生成就变得容易了。项目地址https://github.com/Hades-li/qiankun-vue安装yarnaddqiankun-vuenpminstallqiankun-vue--save从vue-cli到手写webpack配置vue-cli是Vue官方的脚手架工具,傻瓜-likeBuild项目,非常好用。但也许它更适合开发一整套应用程序,而不是一个小型的第三方库。目录结构build:存放webpack配置文件(稍后手写)dist:最终文件输出目录example:用于展示的例子。其实这个目录就是原来vue-cli生成的src目录,但是由于我们要开发第三方库,src目录是用来存放库的源码的,所以我们改了下目录。src:放置源代码的地方。types:typescript类型定义文件使用vue-cli官方的构建方式(deprecated)vue-cli提供了官方的构建库方式vue-cli-servicebuild--targetlib--namemyLib[entry]此次构建的结果为和官方展示的一样,会同时生成多个js库文件。在实际项目参考中,我们只用到一个。也就是说,我们只是不想生成一堆我们不想要的东西。修改vue.config.jsbuild(deprecated)放弃使用vue-cli官方方法。剩下的方法就是重写vue.config.js配置,快速实现构建。下面是一些重要的代码片段来解释if(isProd){config.entry('index').clear().add('./src/index.ts')config.output.filename('index.js')//输出文件名.libraryTarget('umd')//打包type.library('QiankunVue')//全局变量名...}在生产环境中,入口文件是src路径下的入口文件。输出文件设置为index.js,目标类型为umd格式,全局变量为QiankunVueif(!isProd){config.entry('index').clear().add('./example/main.ts')}在开发环境中,目的不是为了打包输出src的源码,而是为了运行example中的例子。所以将入口文件设置为example下的main.ts文件。//排除Vueconfig.externals({vue:{root:'Vue',commonjs:'vue',commonjs2:'vue',amd:'vue'}})由于我们开发的是vue插件,所以需要添加vue被排除在外。此时执行yarnrunbuild后,dist目录下只会生成一个index.js文件。当然,由于我没有屏蔽html模板插件,所以还是会生成index.html。最后放弃了以上两种vue-cli的构建方式,因为我发现打包后的index.js文件大小高达120+KB。这个尺寸明显偏大。但是我找不到原因。webpack配置的这次改动的目的是让它完全独立于vue-cli,开发和生产环境完全定制化。build.js-以函数式方式执行webpack打包。(暂时放弃)以下是webpack.config.base.js基本配置的一些关键代码片段,包括生产和开发环境需要配置module.rules//预处理.ts文件{test:/\.ts$/,use:['babel-loader',{loader:'ts-loader',options:{appendTsSuffixTo:[/\.vue$/],transpileOnly:true}}],exclude:/node_modules/},//预处理。vuefile{test:/\.vue$/,loader:'vue-loader'},这两段代码主要是预处理.ts文件和.vue文件。babel-loader是可选的,它的作用是将es6代码转换为es5以兼容浏览器。现在的chrome、edge、firefox等现代浏览器对es6甚至es7的支持都很好。不加babel-loader可以进一步减小打包文件的体积,运行效率可以更高,但是本着可能还有人还在用ie的态度,还是加吧。//预处理scss{test:/\.s[ac]ss$/,use:[env.NODE_ENV!=='production'?'vue-style-loader':MiniCssExtractPlugin.loader,'css-loader','sass-loader']},//预处理css{test:/\.css$/,use:[env.NODE_ENV!=='生产'?'vue-style-loader':MiniCssExtractPlugin.loader,'css-loader']},预处理scss和css样式。其实在vue-cli搭建的项目中,也是可以支持less和stylu另外两个预编译样式文件的,只是我们现在自定义webpack配置,本着随用随用的原则,我们只需要满足我们自己的要求刚需。//预处理图像{test:/\.(png|jpe?g|gif|webp)(\?.*)?$/,loader:'url-loader',options:{limit:4096,esModule:false,//为5.0及以上版本添加fallback:{loader:'file-loader',options:{name:'img/[name].[hash:8].[ext]'}}}}预处理图像,这里让我们重点说说这个配置项的坑。该配置用于解析图片/文件路径,并对图片进行base64转换。一开始直接用vue-cli查了一个webpack的配置文件,把这部分复制过来。与上面的代码相比,只有esModule没有参数:false。运行结果是所有图片都没有显示出来,图片的查看路径是这样的
