JS Bundle Version: v0.3.0
A JS Bundle is actually a JavaScript file which follows ES5 standard. The code is used to define some custom components for the instance and bootstrap the instance with certain name, config and data. Developers could use all kinds of JS code packager like webpack, browserify, requirejs to organize your whole instance code.
The JS Bundle Must begin with a comment line which is a JSON object like:
// { "framework": "Weex", "version": "0.5.0" }
This JSON object as least contains:
framework
must be "Weex"
version
should be corresponded with the JS Bundle format version
__weex_define__(name, options)
__weex_bootstrap__(name, config, data)
__weex_document__
__weex_require__(name)
__weex_define__(name:string, options: object)
Define a custom component named name
for current instance with options
.
example:
__weex_define__('rmb', {
template: {
type: 'div',
style: {flexDirection: 'row'},
children: [
{type: 'text', attr: {value: '¥'}},
{type: 'text', attr: {value: this.value}}
]
},
data: function () { return {
value: '0' }
},
methods: {...}
})
The enabled component options contains:
template
: just the same as v0.3.0
style
: just the same as v0.3.0
data
: a function which return a plain object to observe by the ViewModel
methods
: a function map to proxy to the ViewModel
computed
: a map of several computed keys for the ViewModel
init
, created
, ready
: lifecycle methods
events
: event handlers for the ViewModel
The enabled ViewModel APIs contains:
$el(id): Element
: find element by id in current ViewModel scope
$vm(id): ViewModel
: find sub ViewModel by id
$getConfig(): object
: get instance config info
$broadcast
/$emit
/$dispatch
/$on
/$off
: listen and fire component events
$transition
(experimental): animation transition (see more in animation native module)
__weex_require__(name: string): object
Get a Weex native module with several native APIs.
example:
var modal = __weex_require__('modal')
modal.toast({
message: 'Hey!',
duration: 2 })
polyfill for v0.3.0
function __weex_require__(name) { var result
define('__weex_require__', function (r, e, m) {
result = r('@weex-module/' + name)
}) return result
}
__weex_bootstrap__(nameOrOptions: string|object, config: object?, data: object?): AppInstance | Error
Start to render by a certain component name or a direct component options as the root element, and some instance config
and instance data
. If everything fine, it will returns the root app instance. Otherwise it will return an Error
instance which describes something wrong.
example:
__weex_bootstrap__( 'root', { // format 1: // downgrade: { appVersion: '>= 0.5.0' }, // format 2: // downgrade: function (config) { return true } }, { // external data // value: '12345' } )
The instance config
now only support downgrade
property which allows two format:
{ osVersion, appVersion, weexVersion, deviceModel }
function (config) { return true }
to return a boolean value. true
means normal and false
means downgrade.
The instance data
will merge to root component data. So the root component is also easy to reuse and the instance data is easy to customize.
__weex_document__
An virtual-DOM Document
instance. Also the host of virtual-DOM APIs. Every Weex instance has and must have just one Document
instance.
define
, bootstrap
, module
, exports
, document
, require
, register
, render
// { "framework": "Weex", "version": "0.5.0" } var modal = __weex_require__('modal')
__weex_define__('item', {
template: {
type: 'div',
style: { flexDirection: 'row' },
event: {
click: function (e) { this.update(e)
}
},
children: [
{ type: 'image', attr: { src: this.imageUrl }, ...},
{ type: 'text', attr: { value: this.title }, ...}
]
},
data: function () { return {
imageUrl: '',
title: '' }
},
methods: {
update: function (e) {
modal.toast({ message: this.title })
}
}
})
__weex_define__('app', {
template: {
type: 'div',
children: [
{
type: 'item',
repeat: {
expression: function () { return this.list
},
key: '$index',
value: '$value'}
},
attr: {
imageUrl: function () { return this.$value.imageUrl
},
title: function () { return this.$value.title
}
}
}
]
},
data: function () { return {
list: [
{ imageUrl: 'xxx', title: '111' },
{ imageUrl: 'yyy', title: '222' },
{ imageUrl: 'zzz', title: '333' }
]
}
}
})
__weex_bootstrap__('app')
A JS Bundle is actually a JavaScript file which follows ES5 standard. The code is organized by several modules with AMD-like format:
define('moduleName1', function (require, exports, module) { // content of module1 })
define('moduleName2', function (require, exports, module) { // content of module2 })
...
A whole Weex JS Bundle is concatenated by these modules and last a bootstrap(rootComponentName, optionalConfig, optionalExternalData)
function call.
define('@weex-component/a', function (require, exports, module) { // content of composed component <a> })
define('@weex-component/b', function (require, exports, module) { // content of composed component <b> })
bootstrap('@weex-component/b')
As the sample above, the component name should be hyphenated (a-z, 0-9, "-"). Other characters are not allowed.
And, the method call bootstrap()
allows 1~3 parameters: root module name (String), config info (optional JSON) and external data (optional JSON).
A module of composed component contains 3 parts: whole options definition, additional template option definition and additional style option definition.
template
option and style
option) into module.exports
template
option is a piece of JSON-like object assigned to module.exports.template
which describes the display structure of this component
style
option is a piece of JSON object assigned to module.exports.style
which describes the reusable styles in this component
The template
option is required and appeared only once, and the style
option and whole options definition are optional.
These options are defined and transformed by Transformer. Actually you can also ignore all the format limitation and write options to module.exports
as the same result if you are not going to use Transformer. But that's not recommended.
A piece of multi-level embedded JSON-like object which describes the view structure.
Every level JSON-like object has these members below:
type
: a required string, component name/type
component
: an optional boolean, whether this component is composed or native
attr
: an optional k-v pairs which contains all attributes of an element, the value could be a string, number, boolean or a function that bind some data value
style
: an optional k-v pairs which contains all styles of an element, just the same format as the attr
classList
: an optional array of strings which contains class names for styling.
events
: an optional k-v pairs whose keys are event type and values are corresponding method names
children
: an optional array of child components info
append
: an optional string which determines a compiling workflow strategy: append node-by-node singly or a whole node tree just one time. the default value is node
and another supported value is tree
.
shown
: a optional function which returns a boolean value to determine whether this component should be displayed
repeat
: a optional function which returns a list data to displays components with each
Corresponding Keys to Weex Transformer:
name
in Weex file corresponds to type
if
in Weex file corresponds to shown
repeat
in Weex file corresponds to repeat
append
in Weex file corresponds to append
style
in Weex file with CSS syntax corresponds to style
class
in Weex file with class names separated by blanks corresponds to classList
on***
in Weex file with prefix on
corresponds to a k-v pair in events
attr
children
All tag names, attr names are case-insensitive and transformed to lower-cased. But the attr values are case-sensitive.
Just a two-levels JSON object.
Corresponding Keys to Weex Transformer: