GithubHelp home page GithubHelp logo

qiu8310 / minapp Goto Github PK

View Code? Open in Web Editor NEW
927.0 30.0 69.0 2.37 MB

重新定义微信小程序的开发

Home Page: https://qiu8310.github.io/minapp/

TypeScript 84.69% JavaScript 14.04% CSS 1.27%
wx-api wechat api typescript promises vscode

minapp's Introduction

minapp

重新定义微信小程序的开发

更新日志

minapp 2.0.0 已经发布,新版本主要采用了 webpack 4,v1.x升级到v2.x请查看

介绍

minapp 是为开发微信小程序而打造的一整套提升开发体验的工具:

  • 提供一个命令行工具 @minapp/cli,用它可以快速创建一个项目,并可以用 webpack 来构建生成的项目;
  • 提供一个开发框架 @minapp/core,此框架是完全兼容原生小程序代码的框架,支持使用 class 的方式来开发,支持代码自动补全,同时提供微信所有 api 的自动补全
  • 提供一个集成了 mobx 的框架 @minapp/mobx,此框架主要给 @minapp/core 注入了 mobx,可以让你轻松使用 mobx 来管理全局数据
  • 提供一个 vscode 插件 minapp-vscode,此插件主要是针对小程序的 wxml 模板语言,可以自动补全所有的组件、组件属性、组件属性值等等

注意:使用 minapp 后,还是需要使用微信官方提供的"微信开发者工具"来测试

使用

  1. 用 npm 安装命令行工具: npm install -g @minapp/cli
  2. 初始化项目:minapp init <你要创建项目的文件夹> (同时支持创建 js 和 ts 项目)
  3. 安装两个 vscode 插件:minappdot-template(可选,但建议安装)

特点

  • 完全兼容原生小程序,所有原生小程序代码可以直接迁移到 minapp 的环境中
  • 集成 webpack 和 webpack-dev-server,编译有保障
  • 可以选择使用 mobx,方便管理全局数据
  • 所有语言在 minapp 的环境中都能自动补全,开发体验超级棒(见下面的功能概览
  • 支持数据双向绑定
  • setData 性能优化

功能概览(在 vscode 编辑器下)

wx 所有接口都有智能的提醒,同时包括接口的参数,和返回值

wx接口示例

非 minapp 用户也可以安装 @minapp/wx 来获取此功能,参见这里

提供一个 promise 版的 wx 接口 wxp,和 wx 一样,只是它会将 wx 中所有需要 success/fail/complete 三个参数的函数 promise 化

  • wxp 中也支持使用 success 回调
  • wxp 给 Promise 添加了一个 finally 方法;如,你可以这样用 wxp.getUserInfo().finally(() => { /* do something */ })

wxp示例

集成 mobx,可以非常方便的修改全局数据,并自动更新当前页面状态

  • 注入 Store 只需要在 appify 函数中添加 Store 对象即可
  • Page 和 Component 中都默认注入了 Store 对象,你可以使用 this.store 获取

mobx

wxml 模板语言支持语法高亮,组件智能提示,组件属性智能提示(需要安装 vscode 插件 minapp

欲了解更多此插件的功能详情,点此查看

wxml

json 文件支持自动提示

json

新建一个 page 文件夹时,自动生成相关文件(需要安装 vscode 插件 dot-template

  • 自动为你创建相关的同名的文件,包括 js/json/wxml/scss,并且这些模板文件你可以随时在 .dtpl 文件夹下修改
  • 自动将新建的 page 路径注入到 app.json 文件夹中

新建 Page 示例

小程序 Page 中支持函数自动提示

Page 中的函数自动提示示例

同理,新建组件文件夹时,也会创建相关的文件;同时组件中的生命周期函数也会自动提示

Component 示例

关于此仓库说明

这不是一个项目,是有好几个项目组合而成的,用的是 lerna 开发工具,其它项目在 packages 目录下,这里对其中的几个主要项目做个简要概述

  • minapp-generator: 此模块负责解析微信官方文档,生成结构化的数据,供其它模块使用
  • minapp-wx: 微信所有原生 api 的 TypeScript 定义,另外提供一个 promise 版的 wx 接口
  • minapp-core: 开发框架,需要依赖 minapp-wx
  • minapp-mobx: 集成 mobx 的开发框架,需要依赖 minapp-core
  • minapp-cli: 提供给用户的命令行工具,并可以快速创建一个新项目
  • minapp-vscode: vscode 插件,为wxml提供语法高亮、标签与属性的自动补全

TODO

  • 小程序中的静态资源自动上传到 七牛 (完成我的 file-uploader 组件)
  • 实现类似于 vue 的功能,可以将所有文件写在一个页面上
  • webpack 升级到 4.0
  • 写一个小程序的自动化测试框架
  • 自定义组件支持智能提示(需要修改 minapp-vscode 插件)

minapp's People

Contributors

chemzqm avatar fxxkscript avatar kyoko-df avatar looch avatar lucasicarus avatar newfuture avatar qiu8310 avatar willing8310 avatar xuyizhe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

minapp's Issues

如何封装wxp.request

在实际项目中,往往请求头, API的BaseUrl 等参数都是相同的, 我需要统一设置API的BaseUrl 以及相关请求头, 请问如果进一步封装或者修改wxp.request?

[建议]小程序标签补全冲突

在 vue 模板文件中,需要指定 template 的 lang="wxml"就能自动补全,
但是不少其他的脚手架工具,比如mpvue的,如果把模版的template的lang改了,会报错,因为默认lang是html。
希望换个自定义属性也能支持补全,比如
在 vue 模板文件中,需要指定 template 的 minapp="true"就能自动补全,

<template minapp="true"></template>

scss 相对路径异常

scss 中多层 import 的情况下, @import 不是相对当前文件的路径, 而是相对于被 import 的文件。

比如:

root
|- c.scss
|- folder
     |- b.scss
     |- folder
          |- a.scss

a.scss

@import '../b.scss';

b.scss

@import '../c.scss'

这种情况会报错,因为 a 中会去寻找 相对 a 的 ../c.scss, 也就是 root/folder/c.scss

xxxify之类api命名调整

minapp里的装饰器都是xxxify这类,个人感觉不是很必要,像spring或者angular都是用的名词命名,直接用对应的名词命名是不是好一点。
在不进行破坏性改动的前提下可以考虑两种都支持

怎么将这个项目跑起来

如果我想做一些修改,然后使用 npm link 将项目跑在本地,需要什么步骤?
试了一下编译发现 ts 报了非常多的错误,minapp-common 里面的 ./Component 找不到,并且这个文件是放进了 .gitignore,不清楚意图。

关于引入echarts的问题?

echarts开发了小程序的引入,但是发现用此框架引入会报错!希望作者可以了解一下。急用!!!!!

用 tsx 作为模版文件产生错误

RT,我在本地用 tsx 作为模版文件编译成 wxml, 但是会导致编译失败,提示无法 resolve tsx 文件,需要一个合适的 loader。 tsx 文件并没有被其他文件引入,预期是能忽略掉 tsx 文件

ps: 把 counter.tsx 改成 counter-wxml.tsx 就好了

WARNING in ./src/app.scss.d.ts
[at-loader] TypeScript declaration files should never be required
Error: [at-loader] TypeScript declaration files should never be required
    at compiler (/Users/z/.config/yarn/global/node_modules/awesome-typescript-loader/src/index.ts:54:28)
    at Object.loader (/Users/z/.config/yarn/global/node_modules/awesome-typescript-loader/src/index.ts:16:18)
 @ ./src/app.cjson 16:0-68

WARNING in ./src/components/counter/counter.scss.d.ts
[at-loader] TypeScript declaration files should never be required
Error: [at-loader] TypeScript declaration files should never be required
    at compiler (/Users/z/.config/yarn/global/node_modules/awesome-typescript-loader/src/index.ts:54:28)
    at Object.loader (/Users/z/.config/yarn/global/node_modules/awesome-typescript-loader/src/index.ts:16:18)
 @ ./src/pages/index/index.cjson 3:0-91 11:0-91
 @ ./src/app.cjson

ERROR in ./src/components/counter/counter.tsx
Module parse failed: Unexpected token (3:37)
You may need an appropriate loader to handle this file type.
| import * as css from './counter.scss'
|
| export default function Counter(props: any) {
|   return (
|     <view class={css.counter}>{props.start}</view>
 @ ./src/pages/index/index.cjson 6:0-85 14:0-85
 @ ./src/app.cjson

webpack 4 的升级计划

不知道什么时候会升级到 webpack 4 呢,另外 cli 能否暴露可自定义 webpack 的配置。

能否扩大 minapp-vscode 的使用范围

插件 minapp-vscode 的使用前提好像是将文件的「语言模式」调为 WXML,但我项目使用的是 min 且对应的「语言模式」是 Vue,好像就没法使用 minapp-vscode 了…

有方法扩大插件的使用范围么,而且将来 minapp 也推 SFC 的话也应该需要这种支持

请问使用 cli 初始化的组件开发模式,在开发过程中如何查看效果?

考虑到通用的组件可以作为一个外部 npm 包导入,使用 cli 初始化了一个 component 项目,但是运行开发模式后发现在 dist 目录下生成的也只是这个组件的代码文件(组件显示需要页面载体),请问开发阶段应该让这个组件在开发者工具中运行查看效果?还有一个组件项目可以包含多个组件吗?

能否在国内的码云上也推一份。

很喜欢你的项目,自己也非常喜欢TS。只是国外网速有点忙,有时候公司的网还上不去,能不能在码云上也推一份代码,谢谢啦

在模版里感知或者校验数据对象的属性 或者 将 tsx 编译成wxml

这个项目非常不错,话说有没有可能支持在模版里感知或者校验数据对象的属性? 或者能像 weact 一样把 tsx 给编译成模版? 之前有过想法用 ts-simple-ast 实现一个 tsx 版的 weact, 不过时间上有点来不及了。。如果 minapp 能支持 tsx -> wxml, css-in-js -> wxss 的话感觉会很棒, 我有时间也可以贡献一点代码。

建议wxp里request返回类型增加泛型

 namespace request {
    type Promised<T> = {
      /**
       * 开发者服务器返回的数据
       */
      data: T
      /**
       * 开发者服务器返回的 HTTP 状态码
       */
      statusCode: number
      /**
       * 开发者服务器返回的 HTTP Response Header
       *
       * @since 1.2.0
       */
      header: any
    }
}

对应的request接口调整

function request<T = any>(OBJECT: request.Param): Promise<request.Promised<T>>

这样在使用的时候就可以指定返回类型了

interface IList {
    code: number;
    list: <{}>[];
}
export async function GetList(name?: string, page?: number) {
  let result =  await wxp.request<IList>({
    url: urlList,
    data: {
      page,
      name
    }
  });

  result.data.code // 自动提示
}

连接线形式的双向绑定失败

使用双向绑定时

// 成功
<view exampleParams.sync="{{parentExampleParams}}"></view>

// 失败
<view example-params.sync="{{parentExampleParams}}"></view>
// 子组件
 properties = {
    exampleParams: {
      type: Number,
      value: 0
    },
  }

关于版本升级的指南。

从0.9版本升级到1.0.2需要怎么做呢?希望作者能给一个升级指南的说明。

之前是用的0.9的版本搭建的,现在页面已经做了一大半了,在升级到1.0.2需要怎么操作呢?

谢谢!!!!

将minapp-generator的tsconfig.json的target调整为es2017会提示done函数找不到

本来想调试简单一些,直接使用node的async、await,就将target调整为es2017,不用typescript的tslib,结果报done不存在了。
如果调整target为es2017的话async库的调用方式不一样,会走asyncify不传递callback

// async.js L192-211
function asyncify(func) {
    return initialParams(function (args, callback) {
        var result;
        try {
            result = func.apply(this, args);
        } catch (e) {
            return callback(e);
        }
        // if result is Promise object
        if (isObject(result) && typeof result.then === 'function') {
            result.then(function(value) {
                invokeCallback(callback, null, value);
            }, function(err) {
                invokeCallback(callback, err.message ? err : new Error(err));
            });
        } else {
            callback(null, result);
        }
    });
}

我将代码调整了一下,大佬要不要参考一下

// cmd.ts L86
let result = await new Generator(key, node, nodeUrl, nodeSource, genDir)
  .exec(res.markdown, res.promise)
  .then((str) => {
    if (!allResult) allResult = []
    if (str) allResult.push(str)
    return allResult;
  })
  //.catch((e: any) => done(e))

  if(done) {
    done(undefined, result)
  } else {
    return result;
  }

less中px单位编译成rpx

问题如下:

// src/example.less
.example {
  font-size:14px;
}
// dist/example.wxss
.example {
  font-size:14rpx;
}

在某些视图中,我希望字体大小在各种设备中保持一致。

编译报错!!

λ minapp dev
events.js:183
throw er; // Unhandled 'error' event
^

minapp v 1.0.1

minapp build 没有读取 NODE_ENV

运行 minapp build --publicPath http://localhost:3000 的时候,NODE_ENV 始终是 production,使用 cross-env NODE_ENV=beta 设置无效,但是 minapp dev的时候 NODE_ENV 的值是正确的。

ts有类型错误好像就不编译了

今天开始用minapp+ts写小程序,碰到一个参数类型是any的错误,控制台提示类型错误
image
然后微信开发工具没有刷新出编译后的js了,我觉得这个是不是有点严格了,类型错误报错就好,但是应该继续编译。

scss 绝对路径?

貌似目前只能这样引用

@import "../../../../../styles/common";

能不能这样

@import "styles/common";

关于Page中缺失的一些方法

Hi, 我发现在Page中其实也有selectComponent/selectAllComponents的方法来获取自定义组件的实例,但目前typings里好像暂无相关定义?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.