项目组前端比较少,为了快速开发,使用的是uniapp来发布多端项目,uniapp目前没法整合web,因此web端使用的是付费的iview-pro组件库来实现。前端
由于项目需求变更比较快,为了不一套逻辑实现屡次,使用的是嵌入的方式来复用web和uniapp相同的功能。vue
这会有以下几个问题:node
同时还有项目混乱的问题:webpack
鉴于上面的问题,考虑在不增长前端开发负担的状况下,解决这些问题,指望:git
首先,uni-app在发布到H5时支持全部vue的语法;发布到App和小程序时,因为平台限制,没法实现所有vue语法。github
具体差别详见:uniapp.dcloud.io/useweb
上文列出的差别数量有限,也就是说,只要避免了这些差别,就能保证uniapp和web代码的基本语法一致性,注意这里是基本语法。vue-cli
其次,uniapp是支持vue-cli以及npm包依赖的。也就是说,uniapp和web能够共用仓库,这就解决了共用代码的管理问题。相似Java,将共用代码打包发布到仓库,uniapp和web分别引用的方式来使用。npm
具体见:json
不过考虑到前期代码改动会比较频繁,以这种方式处理仍是比较麻烦(须要修改、打包、发布、改版本号在install)。因此直接基于git的subtree来实现代码层面的共享(修改、提交、拉取),待代码稳定后,再进行库的管理。
最后,就是组件库问题。web目前使用的是iViewAdminUI,uniapp使用的是原生UI。
uniapp原生UI见:uniapp.dcloud.io/component/R…
二者的差别见上文,主要体如今:
因此最主要的问题,就是如何在web端和uniapp端提供一套语法一致的UI组件库。再结合上面两个功能,便可提供一套多端语法彻底一致的开发规范。
实际上,要提供一套语法一致的UI组件库并不难,只是须要花费一点时间,在原UI库上再封装一层便可。详见下节。
计算机科学中遇到的全部问题均可经过增长一层抽象来解决。
All problems in computer science can be solved by another level of indirection。
by David Wheeler
简单来讲,就是经过抽象一层来解决。
考虑到vue的使用人群更广,也更偏底层,因此在uniapp上抽象来适配vue。
这样能解决两个问题:
假设,web端有以下代码:
这段代码在web端能够直接运行,可是Select在手机端其实并不友好,比较友好的方式应该是Picker,因此,咱们就能够在uniapp里编写一个组件select.vue(这部分代码经过组件库的方式来编写,项目引用便可。)
将其注册到项目中,组件名叫Select,这样上面的Select就会被解释为Picker来处理了。
上面的方案,具体能够分为以下几步实施:
# 建立uni-app
vue create -p dcloudio/uni-preset-vue my-project
## 若是执行失败,能够访问以下git,下载zip包,解压
## 而后执行
vue create -p #{解压目录} my-project
# 运行、发布uni-app
npm run dev:%PLATFORM%
npm run build:%PLATFORM%
%PLATFORM% 可取值以下:
npm i node-sass -D
npm i sass-loader -D
注意,虽然subtree能够任意修改提交,不过仍是尽可能在一处修改,好比在admin-vue项目中编写,不然合并时冲突解决比较麻烦。
使用步骤:
# module是取的别名
git remote add -f module ${上面的项目git地址}
# 将这个项目拉取到 src/module目录下
git subtree add --prefix=src/module module master --squash
git subtree push --prefix=src/module module master
git subtree pull --prefix=src/module module master
npm config set registry http://***/repository/npm-public/
设置后,正常使用npm便可
经过
npm adduser
添加用户!
项目中须要有package.json,注意下面的配置
{
"name": "vue-tmp",
"version": "1.0.0",
"private": false,
"publishConfig" : {
"registry" : "http://***/repository/npm-releases/"
},
...
}
private为false才能上传,publishConfig配置的是上传的仓库路径
使用以下命令登陆registry!
npm adduser --registry=http://***/repository/npm-releases/
在项目根目录下执行:
npm publish
便可上传成功
注意:scripts中不能有publish,不然会触发二次publish!正式releases仓库是关闭reploy的!
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"unit": "jest --config test/unit/jest.conf.js --coverage",
"e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e",
"lint": "eslint --ext .js,.vue examples src test/unit test/e2e/specs",
"build": "node build/build.js"
},
公号:抽象思惟