国内著名前端专家钟钦成与小程序的发展

2024-06-22
来源:网络整理

钟勤成

个人介绍:钟勤成,网名司徒正妹,国内知名前端专家,对浏览器兼容性问题/选择器引擎/内部机制等有深厚经验,开发过/anu等前端框架,撰写过《框架设计》一书。

众所周知,微信自从推出小程序之后,便风靡全国,就像当年互联网蓬勃发展的时候,大家都忙着抢域名、开私人博客一样。小程序之所以如此火爆,是因为微信拥有庞大的用户量,腾讯帮你解决后台问题和很多功能问题(比如分享、支付、视频播放、文件上传),相当于你一个人就能干一家公司的工作。在一部手机上,每个人不可能安装100多个APP,所以这么多小公司生存下来非常不容易,但是借助微信这个大平台,个人也可以推出一款千万人玩的热门游戏,也可以开一些小商城,避开淘宝、京东的锋芒。对于大公司来说,这也是一种新的赚钱方式和引流方式。相信未来小程序会越来越火爆。

但是小程序对于开发者来说功能并不是很强大,它的API很原始,没有类继承,npm支持滞后,不能使用CSS预处理器。因此市面上出现了各种各样的转译框架。转译框架和我们平时使用的框架没太大区别,转译框架把我们写的代码翻译成小程序支持的各种文件格式,比如wxml,wxss等。在写业务的时候,转译框架可以让我们使用比较流行的框架格式来写(之所以使用格式是因为用vue写其实并不是在运行真正的vue,用vue写其实也不是在运行真正的vue)。由于小程序没有DOM,所以流行的框架无法在微信里运行,但是它们的模仿品是可以使用的。

翻译框架的最终目的是统一公司的技术栈,让使用某种技术栈的公司不需要使用 Vue,使用 Vue 作为技术栈的公司不需要学习它。这在招聘和维护方面有很大的优势。

目前市面上的翻译框架有 wepy、、taro 等,前两个是 Vue 风格,使用了 Vue1 的语法,但还有很多 Vue 语法无法支持。Taro 是京东半年多的产品,目前还不够稳定,最大的问题是没有包含组件。

好了,又到了本文主角的时间了,anu 原本是一个迷你框架,兼容性比较高,可以运行 -、-、antd 等。anu 小程序是它的扩展,为其添加了一个 cli 和一个新的 cli,其中 cli 在编译时用于将 JSX 转换成 wxml 等,运行时用于在微信内部运行。

由于小程序的限制,所有涉及DOM的API都无法使用,例如TML、refs.dom,目前不支持,因为函数无法在wxml中运行。其他API可以正常使用,包括

各种生命周期钩子,页面组件也有两个新的钩子

div、h1、span、b 和其他 html 标签

用户以小程序形式编写的各种组件

可以在事件中传递参数,并多次绑定(这是其他翻译框架做不到的一大特色)

多循环支持

es6、es7 语法糖支持

组件标签包含组件标签

支持无状态组件

属性自动映射到

.wx对象拥有原始wx对象的所有方法,并自定义了所有请求接口。

提供两个常用别名@和@,方便用户访问常用组件目录的内容。

说了这么多,我们来看看怎么用吧。

1. 前往下载

git

2.进入anu//cli目录,执行npm link命令(如果之前执行过,则需要npm)

3.返回anu目录并使用

创建小程序项目

4.执行npm命令构建项目

5.然后使用微信开发工具打开

以下 dist 目录

去哪儿网模板作为演示项目,里面包含了一些简单的使用演示,可以使用VS Code打开

src目录下是源代码,dist目录下是最终生成的微信运行的代码。

根据微信小程序的要求,src主要分为三个部分:app.js,目录下的页面组件,目录下的公共组件。

app.js 包含所用页面组件的所有 JS 文件

页面组件源代码和生成的代码如下

  1. import React from '@react';

  2. import Dog from '@components/Dog/index';

  3. class P extends React.Component {

  4.    render() {

  5.        return (

  6.            

  7.                

    类继承的演示div>

  8.                <Dog age={12} />

  9.            div>

  10.        );

  11.    }

  12. }

  13. export default P;

将生成两个文件

  1. "use strict";

  2. Object.defineProperty(exports, "__esModule", {

  3.    value: true

  4. });

  5. var _ReactWX = require("../../../../ReactWX");

  6. var _ReactWX2 = _interopRequireDefault(_ReactWX);

  7. var _index = require("../../../../components/Dog/index");

  8. var _index2 = _interopRequireDefault(_index);

  9. function _interopRequireDefault(obj) {

  10.    return obj && obj.__esModule ? obj : { default: obj };

  11. }

  12. function P() {}

  13. P = _ReactWX2.default.miniCreateClass(

  14.    P,

  15.    _ReactWX2.default.Component,

  16.    {

  17.        render: function() {

  18.            var h = _ReactWX2.default.createElement;

  19.            return h(

  20.                "view",

  21.                null,

  22.                h("view", null, "\u7C7B\u7EE7\u627F\u7684\u6F14\u793A"),

  23.                h(_ReactWX2.default.template, {

  24.                    age: 12,

  25.                    templatedata: "data09558693",

  26.                    is: _index2.default

  27.                })

  28.            );

  29.        },

  30.        classUid: "c70258"

  31.    },

  32.    {}

  33. );

  34. Page(_ReactWX2.default.createPage(P, "pages/demo/syntax/extend/index"));

  35. exports.default = P;

动态链接库

  1. src="../../../../components/Dog/index.wxml" />

  2.   类继承的演示

  3.   is="Dog" data="...data" wx:for="{{data09558693}}" wx:for-item="data" wx:for-index="index" wx:key="*this">

我们再看一下拼多多商城模板,该模板使用Sass作为预处理器。

分享