1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/phodal-weapp-webdemo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

«微信小程序» Web Demo

更多精彩内容请关注:

QRCode

Принцип

Основные элементы MINA в реальном мире

«微信小程序» работает на основе фреймворка под названием MINA. Мы уже рассказывали о нём в предыдущих статьях. Теперь давайте рассмотрим процесс разработки:

Преобразование wxml и wxss

После того как мы внесли изменения в WXML и WXSS, нам нужно перекомпилировать проект, чтобы увидеть результаты в браузере. В это время сервер выполняет несколько преобразующих действий:

  1. wcc преобразует wxml в функцию generateFun, выполнение которой даёт виртуальный дом (virtual dom).
  2. wxss преобразуется в CSS — этот момент требует обсуждения.

wcc и wxss можно найти в каталоге vendor. Если вы откроете «Инструменты разработчика для веб-приложений WeChat», то увидите четыре файла: WAService.js, WAWebview.js, wcss и wxss.

Преобразование файлов JavaScript

Что касается файлов JavaScript, то это процесс сборки, например, файл app.js:

App({
onLaunch: function () { }
})

Он преобразуется следующим образом:

define("app.js", function(require, module){var window={Math:Math}/*兼容babel*/,location,document,navigator,self,localStorage,history,Caches;
        App({
            onLaunch: function () {

            }
        })
});
require("app.js");

Я предполагаю, что вы уже знаете, что это такое, но я не хочу и не буду объяснять. То же самое относится к файлу pages/index/index.js:

define("pages/index/index.js", function(require, module){var window={Math:Math}/*兼容babel*/,location,document,navigator,self,localStorage,history,Caches;
        Page({
            data: {
                text: initData
            }
        });
    require("pages/index/index.js");

Как именно они добавляются или заменяются в HTML, я не буду объяснять.

Как работает MINA?

Чтобы запустить страницу, нам нужен виртуальный дом, который создаётся с помощью функции, преобразованной с помощью wcc:

 /*v0.7cc_20160919*/
        var $gwxc
        var $gaic={}
        $gwx=function(path,global){
            function _(a,b){b&&a.children.push(b);}
            function _n(tag){$gwxc++;if($gwxc>=16000){throw 'enough, dom limit exceeded, you don\'t do stupid things, do you?'};return {tag:tag.substr(0,3)=='wx-'?tag:'wx-'+tag,attr:{},children:[]}}
            function _s(scope,env,key){return typeof(scope[key])!='undefined'?scope[key]:env[key]}
            function _wl(tname){console.warn('template `' + tname + '` is being call recursively, will be stop.')}
            function _ai(i,p,e,me){var x=_grp(p,e,me);if(x)i.push(x);else{console.warn('path `'+p+'` not found from `'+me+'`')}}
            function _grp(p,e,me){if(p[0]!='/'){var mepart=me.split('/');mepart.pop();var ppart=p.split('/');for(var i=0;i<ppart.length;i++){if( ppart[i]=='..')mepart.pop();else if(!ppart[i])continue;else mepart.push(ppart[i]);}p=mepart.join('/');}if(me[0]=='.'&&p[0]=='/')p='.'+p;if(e[p])return p;if(e[p+'.wxml'])return p+'.wxml';}
//далее опущено много текста.

Затем в нашем HTML мы добавляем скрипт:

document.dispatchEvent(new CustomEvent("generateFuncReady", {
        detail: {
            generateFunc: $gwx('index.wxml')
        }
    }))

Это вызовет событие. Я упростил WXWebview.js и получил несколько функциональных компонентов:

  • define.js — здесь определяется AMD модульность.
  • exparser.js — используется для преобразования тегов WXML в теги HTML.
  • exparser-behvaior.js — определяет поведение различных тегов.
  • mobile.js — вероятно, библиотека событий, которая меня не интересует.
  • page.js — ядро кода, где определены Page и App.
  • report.js — всё, что вы говорите, может быть использовано в качестве доказательства.
  • virtual_dom.js — реализация виртуального дома с использованием wcc, также содержит component.css, возможно, называется weui.
  • wa-wx.js — определение API WeChat и взаимодействие между WebView и Native, конфликтует с wx.js.
  • wx.js — аналогично предыдущему, но немного отличается.
  • wxJSBridge.js — Weixin JS Bridge.

Таким образом, я использую эти компоненты для определения различных позиций. Когда мы запускаем пользовательское событие generateFuncReady, virtual_dom.js берёт на себя управление рендерингом:

document.addEventListener("generateFuncReady", function (e) {
    var generateFunc = e.detail.generateFunc;
    wx.onAppDataChange && generateFunc && wx.onAppDataChange(function (e) {
        var i = generateFunc((0, d.getData)());
        if (i.tag = "body", e.options && e.options.firstRender){
            e.ext && ("undefined" != typeof e.ext.webviewId && (window.__webviewId__ = e.ext.webviewId), "undefined" != typeof e.ext.downloadDomain && (window.__downloadDomain__ = e.ext.downloadDomain)), v = f(i, !0), b = v.render(), b.replaceDocumentElement(document.body), setTimeout(function () {
                wx.publishPageEvent(p, {}), r("firstRenderTime", n, Date.now()), wx.initReady && wx.initReady()
            }, 0);
        } else {
            var o = f(i, !1), a = v.diff(o);
            a.apply(b), v = o, document.dispatchEvent(new CustomEvent("pageReRender", {}));
        }
    })
})

Здесь происходит инициализация DOM. Результат выглядит так:

<wx-view class="btn-area">
    <wx-view class="body-view">

*Примечание: перевод выполнен автоматически, возможны неточности.* ```
<wx-text><span style="display:none;"></span><span></span></wx-text>
        <wx-button>add line</wx-button>
        <wx-button>remove line</wx-button>
    </wx-view>
</wx-view>```

```html
<view class="btn-area">
  <view class="body-view">
    <text>{{text}}</text>
    <button bindtap="add">add line</button>
    <button bindtap="remove">remove line</button>
  </view>
</view>```

Очевидно, что view будет преобразован в wx-view, text будет преобразован в wx-text и так далее. Это преобразование вызывается в virtual dom.js, метод называется exparser.

К сожалению, я сейчас застрял на инициализации данных ~~, здесь есть две разные системы событий, которые вызывают некоторые проблемы. Одна из них — WeixinJSBridge, а другая — система событий в app engine, и они не могут взаимодействовать друг с другом.

### Разработка с использованием WebStorm

Перед запуском в браузере нам нужно просто смоделировать некоторые методы, такие как:

 - window.webkit.messageHandlers.invokeHandler.postMessage
 - window.webkit.messageHandlers.publishHandler.postMessage
 - WeixinJSCore.publishHandler
 - WeixinJSCore..invokeHandler

Затем преобразуем содержимое config.json в __wxConfig, например:

```javascript
__wxConfig = {
    "debug": true,
    "pages": ["index"],
    "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "WeChat",
        "navigationBarTextStyle": "black"
    },
    "projectConfig": {
    
    },
    "appserviceConfig": {
       
    },
    "appname": "fdfafafafafafafa",
    "appid": "touristappid",
    "apphash": 2107567080,
    "isTourist": true,
    "userInfo": {}
}

Например, наше имя приложения — «Хахахахахаха» — я из Фуцзяня.

Затем мы импортируем различные файлы js в наш html, ларго.

Нам также нужен автоматизированный скрипт gulp для отслеживания изменений wxml и wxss и их компиляции, например:

exec('./vendor/wcc -d ' + inputPath + ' > ' + outputFileName, function(err, stdout, stderr) {
            console.log(stdout);
            console.log(stderr);
});

Я сказал так много, но вы можете просто посмотреть код.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/phodal-weapp-webdemo.git
git@api.gitlife.ru:oschina-mirror/phodal-weapp-webdemo.git
oschina-mirror
phodal-weapp-webdemo
phodal-weapp-webdemo
master