微信小程序开发大坑盘点

news2024/11/15 18:56:58

微信小程序开发大坑盘点

起因

前几天心血来潮,想给学校设计个一站式校园小程序,可以查询成绩,考试信息,课表之类的(本来想法里是还想包括一些社交功能的,但这个因为资质问题暂且搁置了)。其实很久以前就有大概了解过微信小程序的一些概念,那个时候试图用 uni-app 做,但是这玩意太难用所以不了了之了。

于是这次打算正经的用微信自己的那套东西做,结果不出意外的是入了深坑......

大坑

微信小程序云函数外部调用异常

微信小程序提供 wx.request 发起 HTTP 请求,由于微信不是浏览器,没有跨域限制,这方便了很多事,但是由于 wx.request 函数只能对 HTTPS 协议的地址发起请求,而我们学校的教务系统又是清一色的 HTTP,因此我需要一个可以用来帮助我发起 HTTP 请求的转发接口。

对于这种简单需求,云函数显然是最好的解决方案,进而我发现微信小程序自带云函数的支持,于是便兴冲冲地写了一段 NodeJS 代码,放上去跑。

结果我发现不知道为什么,请求其他网站都没问题,唯独请求我们教务系统就会原地超时。经过了几个小时的调试,最后以失败告终,转而改用腾讯云的云函数。

代码也十分简单:

        

const url = require('url')

const express = require('express');
const app = express()
const port = 9000

const rp = require('request-promise')

app.use(express.json());

app.post('/', async (req, res) => {
  const jar = rp.jar()

  try {
    const response = await rp({
      ...req.body,
      resolveWithFullResponse: true,
      simple: false,
      jar: jar
    })
    res.json(response)
  } catch (e) {
    res.json(e)
    console.error(e)
  }
})

app.listen(port, () => {
  console.log("Successfully loaded")
})

其中额外引入了 request-promise 库(express 是默认引入的,腾讯云函数这里做的不错,对 npm 支持很好)。

然后做了一个模仿 wx.request 调用风格的 request 函数,这样我就可以在 wx.request 和我自己的 request 函数中无缝切换(更进阶的是,我自己写的这个还额外支持了以 Promise 风格调用。

export async function request(data) {
  try {
    const res = await rp({
      ...data,
      uri: data.url,
      headers: data.header,
    })
    let result = {
      ...res,
      data: res.body,
      header: res.headers
    }
    if (result.statusCode != 200) {
      throw {
        err_msg: "内部错误"
      }
    }
    if (data.dataType === 'json') {
      result.body = JSON.parse(result.body)
    }
    data.success && data.success(result);
    data.complete && data.complete({})
    return result;
  } catch (e) {
    data.fail && data.fail(e)
    data.complete && data.complete({})
    throw e;
  }
}

function rp(data) {
  return new Promise((resolve, reject) => {
    wx.request({
      method: 'POST',
      url: 'https://service-abcdefg-123456789.gz.apigw.tencentcs.com/release/',
      data: data,
      success: (res) => {
        resolve(res.data)
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

ES6 module 和变量作用域支持差

不知道为什么,微信小程序完全不支持 ES6 module,即使它是支持 ES6 语法的。也就是说,你只能使用这种传统的 CommonJS 方式引入:

const module = require('module.js')

而不是 ES6 的 import 语法:

import module from 'module.js'

最离谱的是,微信小程序这个基于 VSCode 的编译器会给你 warn 这段代码,告知你可以转换为使用 import 导入。

于是这又引出了另外一个奇怪的问题:当你在一个界面的逻辑层文件上声明变量时,IDE 会认为这个变量是一个全局变量,因此在其他界面声明同名变量会得到一个 error,即使不会导致任何编译错误。

这导致了,现在我的模块引入必须用一种很奇怪的写法...

 

const sessionModule = require('../../utils/session');
const tgcModule = require('../../utils/tgc')
const cryptoModule = require('../../miniprogram_npm/crypto-js/index.js')

奇葩的 NPM 支持

在以前,微信小程序是不支持包管理器的,这也就意味着,你得手动把那些库的 JS 复制到你的项目目录里再引用,非常麻烦。但是现在好了,微信可以自动帮你做这件事了。

没错,是自动帮你复制,而不是做了包管理器支持。

怎么说呢...你需要先在你的项目源代码目录中 init 一个 package.json 并 add 你需要的包然后 install,接下来点击 IDE 顶栏的 Tools - Build npm 选项,Weixin Devtools 就会帮你生成一个 miniprogram_npm文件夹,将每个项目各自 combine 到一个 index.js 然后塞到各自名字的文件夹里,然后,你就能通过上面那种方式手动引入使用了。

很奇葩但是... 勉强能用(而且不限制使用的包管理器,比如我用的就是 yarn)。

避免使用双向绑定

微信小程序的 WXML 存在一个有限的双向绑定支持,也是类似 Vue 的那种语法糖:

<input model:value="{{value}}" />

但是这个双向绑定不知道为什么,在某些情况下会认为你没有设置一个 bindinput 事件(但实际上应该是由双向绑定自动设置的),于是不断地在后台刷警告,因此还不如手动实现来的省心。

有限的标准组件支持

如果你觉得微信小程序的开发和前端开发差不多,那就大错特错了。因为微信小程序默认情况下根本不支持任何 HTML 元素,而是套了一层他们自己的元素,比如 view 实际上是 classblock 则和 Vue 的 template 差不多(微信小程序也有 template 元素,只不过那个是给组件用的),不分 h1h2spanstrong,只有 text 元素等。当然好在 CSS 还是那套,基本都能用。

但是... 微信小程序提供的元素依然太少了,根本没办法满足实际开发需要(比如根本没有表格元素)。于是微信小程序提供了一个  rich-text 元素,可用于渲染 HTML 元素。

但是这个 rich-text 就显得十分鸡肋,他不是通过 slot 传入 HTML 元素,而是通过 string 或者 object。这凭空增加了开发难度,导致我不得不这么写:

<rich-text nodes="{{nodes}}"></rich-text>
this.setData({
      nodes: licenses.map(it => {
        return `
        <div style="margin: 20px 10px;"><strong>${it.projectName}</strong>
        is licensed under the <code>${it.licenseName}</code>:</div>
        <pre style="overflow: auto; background-color:#F5F6FA;"><code>${it.fullLicense}</code></pre>
        ${it.sourceRepo?`<div style="margin: 20px 10px;"><span style="color:gray; font-size: 12px;">The source code can be found at: ${it.sourceRepo}</span></div>`:""}
        <br/><br/>
        `
      }).join("")
    })

甚至这么写:

完美的回答了知乎有人“为什么不用 JSON 表达页面而是用类似 XML 一样的 HTML”的问题。

最后

虽然吐槽了这么多,但是微信小程序还是有一些不错的点的。除了上面说的宽松的跨域策略以外,微信小程序的 TypeScript 支持很完善,IDE 工具链做的也不错(除了他那个特别容易崩溃的 Simulator),加之微信开放社区的活跃度也不低(问问题一天内就有人回复),也算是能用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/642795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原生态Ajax价绍与使用方法

目录 什么是Ajax&#xff1f; 什么是原生态Ajax&#xff1f; Ajax使用方法与步骤 步骤&#xff1a; 代码示例&#xff1a; 什么是Ajax&#xff1f; 当谈到Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;时&#xff0c;我们指的是一种用于在网页上进行异步…

效率低?不灵活?别担心,试试低代码应用开发平台,一招搞定!

在日常办公中&#xff0c;你有没有遇到办公效率低下、表格制作不灵活等常见问题&#xff1f;在大数据时代&#xff0c;这样的问题在现代化办公环境中经常遇到&#xff0c;也成为了大众头疼问题之一。要想解决这个问题&#xff0c;可以了解低代码应用开发平台&#xff0c;它的灵…

【六一儿童节】九九乘法表

文章目录 前言循环嵌套循环结语 前言 非常感谢您点进来这篇特殊的文章&#xff0c;时间匆匆&#xff0c;不知不觉已来到了自己的第三十余个儿童节。 很开心&#xff0c;小时候节日在学校和小朋友们一起玩耍&#xff0c;后来长大了又和兄弟们一起疯。很幸运!现在还有公司带着我们…

思否黑马圆满收官,28 支队伍创意使用 Jina AI 三款 AIGC 装备!

上周末&#xff0c;杭州被 AI 热潮所沸腾&#xff01;SegmentFault AI Hackathon 杭州站暨思否 11 周年特别活动在 G5 创投中心拉开帷幕&#xff0c;超过 30 支团队参加了 32 小时的极限编程挑战&#xff0c;他们的产品展示直击评委的心&#xff0c;其中 28 支队伍得到了 Jina …

Windows/Linux搭建Stable Diffusion WebUI

什么是Stable Diffusion WebUI&#xff1f;能用来干嘛&#xff1f; Stable Diffusion WebUI&#xff08;以下简称SD&#xff09;是一个基于Gradio库的Stable Diffusion的浏览器界面&#xff0c;可以方便地配置和生成AI绘画作品&#xff0c;并且进行各种精细地配置。Stable Dif…

如何挂载企业邮箱网盘到windows本地

西部数码的企业邮箱网盘支持本地挂载功能&#xff0c;可以不用任何客户端&#xff0c;方便的将企业邮箱的个人网盘和企业网盘挂载到本机&#xff0c;并像本地硬盘一样使用&#xff0c;支持复制、粘贴、删除、改名等操作&#xff0c;将极大的方便用户对网盘文件的使用&#xff0…

grpc 实现grpc gateway(window环境)

官网&#xff1a;https://grpc-ecosystem.github.io/grpc-gateway/ github&#xff1a;https://github.com/grpc-ecosystem/grpc-gateway grpc gateway的原理官网有介绍。总结一下就是&#xff1a; gRPC-Gateway帮助你同时以gRPC和RESTful风格提供你的API。grpc-gateway旨在为您…

从零开始 Spring Boot 39:循环依赖

从零开始 Spring Boot 39&#xff1a;循环依赖 图源&#xff1a;简书 (jianshu.com) 什么是循环依赖 我们看一个例子&#xff1a; Component public class Person {private Dog pet;public Person(Dog pet) {this.pet pet;} }Component public class Dog {private Person o…

《项目实战》 Jenkins 与 CICD、发布脚本

前言 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行&#xff08;这个比较抽象&#xff0c;暂且写上&#xff0c;不做解释…

Monocle2拟时基因富集分析

****Monocle2全部往期精彩系列&#xff1a;1、群成员专享&#xff1a;Monocle2更新&#xff08;就是重新梳理一下&#xff09;2、一键跑完monocle2&#xff1f;3、ggplot2个性可视化monocle2结果4、ggplot修饰monocle2拟时热图&#xff1a;一众问题全部解决5、Monocle2终极修改…

IDEA 开发必备神级插件

“工欲善其事, 必先利其器” 分享几款 自用好用到起飞的 IDEA插件 插件下载方式 file->settings->plugins->macketplace—>然后搜索 1. Alibaba Java Coding Guidelines 阿里巴巴编码规范检查插件&#xff0c;让你的代码更规范 2. Tabnine 代码自动补全工具…

redis源码之:跳跃表skiplist

老规矩&#xff0c;先来看看大致结构&#xff1a; debug所用demo如下&#xff1a; #include "src/server.h"void testSDS(); void testAlign(); void testZipList(); void testSkipList(); void testQuickList();int main(int argc, char **argv) { // testAli…

flutter DevTools(1)

在VSCODE中调试 第一步&#xff1a; ① 切换到 vscode 的调试和运行模式, ② 配置好 .vscode 中的启动项 launch.json ③ 共有四种模式 [1] debug : 模式编译产物适合纯 Flutter 侧代码的开发、调试 [2] profile : 的用来做性能分析和测试 [3] release : 的用于打包发布 [4]…

DBeaver连接(DM)达梦数据库

DBeaver连接(DM)达梦数据库 文章目录 1.下载驱动2.DBeaver新建驱动3.连接DM数据库4.JDBC 接口 DBeaver是一款功能强大的数据库管理工具&#xff0c;可以连接多种类型的数据库。下面是连接达梦数据库的步骤&#xff1a; 打开DBeaver并点击“连接”按钮。在弹出的“连接”对话框中…

几个直接在TigerISP上查看全志芯片接Sensor分辨率的方法

TigerISP是全志提供的量产工具&#xff0c;在连接TigerISP时需要填写Sensor名称、Sensor分辨率、Sensor帧率及选择ISP通道、Vich、Wdr模式等… 准备工作&#xff1a;打开debugfs 操作&#xff1a;adb shell进入系统后输入以下两个命令&#xff1a; mount -t debugfs mone /s…

如何成功实施一个数据治理项目?实施步骤有哪些?

企业数字化转型以数据为中心&#xff0c;通过数据驱动业务发展、管理协同和运营。因此&#xff0c;数字化转型关键在于数据&#xff0c;数据治理则需先行。从而更好激发数据生产要素潜能&#xff0c;实现业务数据化、数据价值化&#xff0c;助力企业数字化转型。 那么何为数据…

零代码产品新秀敲敲云与明星产品简道云、轻流对比

零代码产品正在成为当今技术领域的热门话题。随着人们对更快、更简单的开发流程的需求不断增加&#xff0c;零代码产品正在作为一种解决方案得到越来越多的关注。 零代码技术源于低代码技术&#xff0c;与低代码不同的是&#xff0c;零代码不需要任何代码编写。这意味着即使是普…

让人头疼的时序数据预测,这个方案居然三步就搞定了?

数字化时代&#xff0c;时序数据预测已经从一种理论研究转变为各行业实际运营中的关键工具&#xff0c;这种预测可以覆盖广泛的业务领域&#xff0c;比如&#xff1a; 利用历史销售数据进行未来销售趋势的预测 根据既往的电力消耗数据预估未来电力需求 基于过去的股市行情预测未…

释放 OpenAI 和 ESP-BOX 的力量:ChatGPT 与乐鑫 SoC 融合指南

当前&#xff0c;我们正见证着一场技术革命&#xff0c;而 OpenAI 正处于这场变革的最前沿。其中最激动人心的创新之一就是ChatGPT&#xff0c;它运用自然语言处理的力量&#xff0c;打造出更加引人入胜、直观的用户体验。而将 OpenAI 的 API 与物联网设备相结合&#xff0c;更…

Spring Cloud Kubernetes配置使用详情

目录 一、 为什么你需要 Spring Cloud Kubernetes&#xff1f; 二、 Starter 三、 用于 Kubernetes 的 DiscoveryClient 四、Kubernetes 原生服务发现&#xff08;service discovery&#xff09; 五、Kubernetes PropertySource 的实现 1、使用 ConfigMap PropertySource …