本来我是用mpvue的,也没接触过react,但人生充满惊喜,写taro的离职了所以我就临时接下了好几个taro的项目···
碰到的问题
1、yarn dev:weapp编译时报错,TARO版本不一致
错误 版本问题 Taro CLI 与本地安装的小程序框架 @tarojs/taro-weapp 版本不一致,
请确保一致
Taro CLI: 1.2.4
@tarojs/taro-weapp: 1.2.26
error Command failed with exit code 1.
因为手上好几个项目,偏偏各个项目用的框架、node版本、taro版本都有些不一样。。。 所以遇到这种坑die问题
我第一反应是有没有像NVM那样的,针对taro的版本管理工具,百度了一圈貌似并没有。
然后我检查了一下项目taro版本,package.json里写的tarojs版本都是1.2.26,看了下项目node_modules里的@tarojs版本也是1.2.26,然后taro -v
显示的版本是1.2.4。所以只是全局tarojs跟我的项目tarojs版本不匹配。
Emmmm~ 果断yarn global add @tarojs/[email protected]
安装完成taro -v
显示的版本是1.2.26。完美~~
再yarn dev:weapp
,编译完成!
2、编译运行,开发工具里报错
thirdScriptError
(0 , _index.genCompid) is not a function;at api nextTick callback function
TypeError: (0 , _index.genCompid) is not a function
- 原因
Tarojs 版本与项目Taro不一致 - 解决
更新 Taro CLI 工具
$ taro update self
更新项目中 Taro 相关的依赖
$ taro update project
但是这种方式会把原项目里低版本的Taro更新到高版本的Taro,在项目中可能会导致一些方法不支持,或者sass版本依赖问题。
所以出现方法报错或者样式错乱的问题的话,就把node_modules删掉,按上面1的方式修改全局tarojs版本跟项目tarojs版本保持一致,重新yarn
3、其他问题
1) html中通过
显示空格,必须要在标签上加上decode={true}
2) 自定义组件正常是不能通过className
来定义样式的,因为自定义组件是用shadow-root包装,而且自定义组件标签上没办法加class
官方解决方案:基础库版本 >= 1.9.90 可以用 externalClasses
//子级
public static externalClasses = ['css-class'];
//父级
3) 自定义组件报错
thirdScriptError
Cannot read property 'apply' of undefined; [Component] Event Handler Error @ core/components/Ico/index#(anonymous)
TypeError: Cannot read property 'apply' of undefined
at Ico.funPrivateIXScU
- 表现
自定义了一个图标组件Ico
,在页面上点击Ico
元素,会报如上错误; - 解决
Ico
组件中调用了onClick
事件,但是没有定义onClick
;
加上
就可以了public static defaultProps = { onClick: () => {} };
4) windows10 微信PC端打不开小程序问题
具体问题描述看微信PC端(windows),有些小程序打不开? - 微信开放社区
其实微信PC客户端的兼容做的有点问题,但是官方开发小哥哥让我改小程序的语法去解决兼容问题 。那好吧~~
我测试时把调试基础库下调到了2.0.4,然后会出现一个警告错误微信小程序暂不支持 getMenuButtonBoundingClientRect
,根据开发文档做下兼容处理就好。
主要问题:
1、Object.values is not a function
可以这样改:
// Object.values(this.subscriptions).forEach(subscription => {
// subscription.unsubscribe();
// });
//不用Object.values,替换成下面的
Object.keys(this.subscriptions).forEach(subscription => {
this.subscriptions[subscription].unsubscribe();
});
2、Object.getOwnPropertyDescriptors is not a function
//自己定义一个getOwnPropertyDescriptors方法,替换Object.getOwnPropertyDescriptors就OK了
function getOwnPropertyDescriptors(obj) {
const result = {};
for (let key of Reflect.ownKeys(obj)) {
result[key] = Object.getOwnPropertyDescriptor(obj, key);
}
return result;
}
3、还有关键就是ES6语法没有被正确解析导致的,可以在开发者工具中打开ES6转ES5
,增强编译
。
然后报了个错:regeneratorRuntime is not defined
,可以安装依赖:
yarn add babel-plugin-transform-runtime --dev
yarn add babel-runtime
并修改config/index.js
文件
plugins: [
'transform-decorators-legacy',
'transform-class-properties',
'transform-object-rest-spread',
+ ['transform-runtime', {
+ "helpers": false,
+ "polyfill": false,
+ "regenerator": true,
+ "moduleName": 'babel-runtime'
+ }]
}
然后编译,又报了个错:Cannot read property 'Array' of undefined
这个错是在lodash.js
中产生的,这个lodash
是个坑;
但我的项目中只有一个地方用到了lodash的merge方法,在utils.ts
中引入了import _ from 'lodash/fp';
,在assets/index.ts
中使用了return _.merge(assets, customAssets);
。所以直接替换掉这个merge方法就好了
//就不使用lodash/fp的merge了,转ES5有兼容问题,自己实现一个
function isObject (value) {
const type = typeof value
return value !== null && (type === 'object' || type === 'function')
}
function merge (source, other) {
if (!isObject(source) || !isObject(other)) {
return other === undefined ? source : other
}
// 合并两个对象的 key,另外要区分数组的初始值为 []
return Object.keys({
...source,
...other
}).reduce((acc, key) => {
// 递归合并 value
acc[key] = merge(source[key], other[key])
return acc
}, Array.isArray(source) ? [] : {})
}
const _ = {
merge
}
好了 搞定!完美!
吐槽:我拿着国家发行的新版人民币去TX小店买辣条,店老板居然说这钱我没见过,你不能用。那我能怎么办?回去换个旧版的人民币再过来买呗。哎哟我这个折腾的!你有本事以后也只认旧版的!