更多精彩内容请关注:
«微信小程序» работает на основе фреймворка под названием MINA. Мы уже рассказывали о нём в предыдущих статьях. Теперь давайте рассмотрим процесс разработки:
После того как мы внесли изменения в WXML и WXSS, нам нужно перекомпилировать проект, чтобы увидеть результаты в браузере. В это время сервер выполняет несколько преобразующих действий:
wcc и wxss можно найти в каталоге vendor. Если вы откроете «Инструменты разработчика для веб-приложений WeChat», то увидите четыре файла: WAService.js, WAWebview.js, wcss и wxss.
Что касается файлов 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, я не буду объяснять.
Чтобы запустить страницу, нам нужен виртуальный дом, который создаётся с помощью функции, преобразованной с помощью 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 и получил несколько функциональных компонентов:
Таким образом, я использую эти компоненты для определения различных позиций. Когда мы запускаем пользовательское событие 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 )