2021.11.3 星期三 17:00
基础
语法
生命周期
每次进入小程序首页的时候有时候会先执行onlaunch方法,有时又会先执行首页的onload的方法,最后经过确定,在微信小程序中这两个方法并没有执行先后的顺序,因为他们都是异步执行的。
问题: 本来按照事件顺序,小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad,但是在onLaunch里请求获取是否有权限,等待返回值的时候Page里的onLoad事件就已经执行了。
全局变量
方法1:在taro中 getApp()只能取到一开始定义的值,并不能取到改变后的值
要在构造函数中创建,或者在函数外定义,如果在componentDidMount()函数中定义无效。
PS: 如果是混合到原生小程序中,同样取不到Taro小程序里定义的变量。
方法2:新增一个自行命名的 JS 文件,例如 global.js1
2
3
4
5
6
7const globalData = {}
export function setGlobalData (key, val) {
globalData[key] = val
}
export function getGlobalData (key) {
return globalData[key]
}
方法3:使用 Redux 来进行全局变量的管理
方法4:使用配置。
使用config下的env
使用config下的defineConstants
dom 相关
标签
- 获取输入标签的值
Input
Textarea
通过event.detail.value
。 为防止按钮提交的时候,onblur 还没有设置好值。提前函数可以添加延时setTimeout。
组件
Children 与组合this.props.children
, this.props.renderHeader
修改路径-url
在现有路径上面添加参数。
(h5)使用new URI
可以获取路径,但是修改hash的时候报错了:不可以修改。
正确方式:需要获取路径(小程序),然后调用路由跳转方式。getCurrentInstance().router
和getCurrentPages
1
2
3
4
5
6
7
8
9const router = Taro.getCurrentInstance().router || { params: {}, path: '' };
const go2CouponList = useCallback(() => {
// location.hash = 'jdyushouquan';
// history.pushState('couponList', '', null)
let path = router.path;
const url = path.replace(/#.*/g, '') + '#jdyushouquan'
// console.log('url', url)
gotoUrl({url});
}, []);
在旧版本中可以通过 this.$router 访问当前组件/页面路由的详情。在 Taro Next 对应的 API 是在 @tarojs/taro 中的 getCurrentInstance().router,两者的属性一模一样。
###
// useEffect(() => {
// history.pushState(‘couponList’, ‘’, null)
// return () => {
// if(!history.state.couponList) {
// Taro.removeStorageSync(‘bl_confirm_cids’);
// }
// }
// }, []);
api
配置
webpack
v3.4.1 版本默认使用webpack 4.x。 后续版本可以指定webpack 版本。
插件
- 读取根路径的上一级(混合项目需要),
const rootPath = path.resolve(__dirname, "../../..");
plugins/1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40export default (ctx) => {
ctx.onBuildFinish(async () => {
if (!ctx.runOpts?.options?.blended) return;
copyFiles();
});
})
const copyHtmlFiles = (ctx) => {
try {
// console.log('copy html files', ctx);
const { paths: { outputPath }, initialConfig } = ctx;
// console.log('copy html files', ctx);
// m_static 中html文件夹路径
// const destPath = path.resolve(__dirname, "../../../../m_static/html");
const rootPath = path.resolve(__dirname, "../../..");
// const mProjectPath = path.resolve("../", appPath);
const destPath = path.join(mProjectPath, "m_static/html");
const customRoutes = initialConfig?.h5?.router?.customRoutes;
// console.log('bjdi', mProjectPath, destPath, customRoutes)
Object.values(customRoutes).map(route => {
// html文件路径
const filePath = path.join(destPath, route);
if (fs.existsSync(filePath)) fs.removeSync(filePath);
fs.copyFileSync(outputPath + "/index.html", filePath);
// # 写入特定html片
const pos = ` <div id="app"></div>`;
const inc0 = ` <!--#include virtual="/sinclude/common/spdtimming_foot.shtml"-->`
const inc1 = ` <!--#include virtual="/sinclude/common/cart_link_guide.shtml" --> <!-- 结算链接灰度控制ppms -->`
const inc2 = ` <!--#include virtual="/sinclude/update/wx/2016/5/cartlock.html"--> <!-- 购物车lock 灰度ppms-->`
if (["/order/orderlist_jdm.shtml"].includes(route)) {
const data = fs.readFileSync(filePath, "utf8");
const html = data.replace(pos, [inc1, pos, inc0].join("\r\n"));
fs.writeFileSync(filePath, html);
}
});
console.log("拷贝html结束!");
} catch (e) {
console.log("拷贝html失败!", e);
}
}
多端
命令行
1 | taro -h |
1 | taro inspect --help # -h |
ISSUES
运行
run dev 后访问页面路由出现Cannot GET /order/xxx.shtml
原因:可能是有错误运行失败了(虽然看到是控制台输出是正常的)
升级
uploadFile 上传文件跨域
从3.4.1升级到3.5.7: 解决Taro.uploadFile 上传图片出现跨域的问题。
解决:需要手动添加withCredentials: false (修改node_modules)
Taro 3.5.6: uploadFile 上传文件始终报跨域问题运行失败:
Cannot find module '/Users/xxxxxx/node_modules/react-refresh/index.js'. Please verify that the package.json has a valid "main" entry
解决:在devServer配置hot: false
1
2
3
4
5devServer: {
port: 10086,
open: false,
hot: false,
}
但是添加这个配置后,出现下面RefreshReg
的问题:
- 运行成功,但是页面报错:
Uncaught ReferenceError: $RefreshReg$ is not defined
解决: 根据升级3.5.7后Uncaught ReferenceError: $RefreshSig$ is not defined 中提示升级到3.5.8. 并且修改了fast refresh相关配置。或配置了 Webpack devServer 关闭热更新:hot: false 时,会出现以下报错:
而且 fast refresh 的 Babel plugin 和 loader 必须同时启用或关闭。
<!–
其他解决方案: npx browserslist@latest --update-db
失败
【taro react】—- 编译H5运行后报错:Uncaught ReferenceError: $RefreshSig$ is not defined- 设置webpack
mode: 'development'
, 原因未webapck5热更新问题。
Webpack使用ReactRefreshWebpackPlugin对JSX文件进行本地热更新解析时 $RefreshSig$ is not defined 在dev配置中添加
isWatch: true
1
2
3
4
5
6
7
8
9
10module.exports = {
mode: "development",
env: {
NODE_ENV: '"development"'
},
defineConstants: {},
isWatch: true,
mini: {},
h5: {}
}升级3.5.7后Uncaught ReferenceError: $RefreshSig$ is not defined
- 根据升级3.5.7后Uncaught ReferenceError: $RefreshSig$ is not defined继续升级到3.5.8
chore(release): publish 3.5.8 –>
启动
- watch 文件修改没有更新
npm run build dev:h5
1
"dev:h5": "cross-env NODE_ENV=development CLIENT_ENV=h5 taro build --type h5 --watch",
app.config.js 中pages配置和文件夹名 大小写不一致。
taro@3.6.1 需要手动安装 @tarojs/plugin-platform-h5, @tarojs/plugin-platform-weapp
process is not defined #4935
引入依赖,比如@plato/commponents 报错。(已经定义了使用的环境变量)
原因:可能依赖中有用到。
解决:最好定位到应用的变量,尝试定义。或者不使用。
react-scripts@latest
,react-error-overlay
无效。
<!--
其他:
[React ReferenceError: process is not defined 错误解决](https://www.jiyik.com/tm/xwzj/web_1747.html)
[【控制台】报错:Uncaught ReferenceError: process is not defined](https://blog.csdn.net/qq_45677671/article/details/127671019)
[React 错误 Uncaught ReferenceError: process is not defined 解决](https://www.jiyik.com/tm/xwzj/web_1016.html)
[React Uncaught ReferenceError: process is not defined](https://stackoverflow.com/questions/70368760/react-uncaught-referenceerror-process-is-not-defined)
> 该错误是由 react-error-overlay 包引起的,该包具有已更新以支持 webpack v5 并且与 react-scripts v4 不兼容的依赖项。
`npm install react-scripts@latest`
> 如果错误没有解决,请尝试安装 6.0.9 版本的 react-error-overlay 包。
开我们的 package.json 文件并添加以下解决方案对象。`resolutions: {react-error-overlay: 6.0.9}`
see:[Is this the bug of react-error-overlay? #11773](https://github.com/facebook/create-react-app/issues/11773)
[Uncaught ReferenceError: process is not defined (NOT react-error-overlay) #12212](https://github.com/facebook/create-react-app/issues/12212)
PS: 没有用。 -->
平台
在windows中转化后的路径 taro-cli 不能正确编译1
2
3编译失败...
./src/app.tsx
untime' in 'E:\order\src\'resolve 'E:orderpluginsevents
windows 的路径是\\
,build的时候找不到;而且把\r也转义了。1
2
3
4
5
6
7
8
9
10
11function injectRuntimePath(platform) {
// const injectedPath = path.join(__dirname, "./runtime"); // windows 有问题
const injectedPath = path.normalize(path.join(__dirname, "./runtime"));
if (isArray(platform.runtimePath)) {
platform.runtimePath.push(injectedPath);
} else if (isString(platform.runtimePath)) {
platform.runtimePath = [platform.runtimePath, injectedPath];
// windows 有问题,手动修改路径
// platform.runtimePath = [platform.runtimePath, 'E:/order/plugins/events/runtime'];
}
}
安装问题
版本不一致
大概率所有问题都可以通过版本一致去解决。
包括:路由问题,。。。等
涉及到依赖:1
2
3
4
5
6
7
8{
"@tarojs/components": "3.3.12",
"@tarojs/react": "3.3.12",
"@tarojs/runtime": "3.3.12",
"@tarojs/taro": "3.3.12",
"@tarojs/cli": "3.3.12",
"@tarojs/mini-runner": "3.3.12",
}
gyp ERR! find VS gyp ERR! find VS msvs_version
windows 安装
gyp ERR! find VS gyp ERR! find VS msvs_version not set from command line or npm config gyp ERR! find
error gyp ERR! stack Error: Could not find any Visual Studio installation to use
1 | npm install --global --production windows-build-tools |
解决问题步骤:
0) 手动安装了python3.8. (版本保持是一致的)
1) 设置了msvs_version 的版本 2019
2) 手动安装了visual studio 的相关应用(web, Linux, node, .net, C++ 等).
3) 最后设置了npm registry 为原始地址.