* [jsfm] refactor the logic in runtime init
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/bade9551 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/bade9551 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/bade9551 Branch: refs/heads/0.16-dev Commit: bade95514eb57eaf0dec7a4bf42f07b33f9c9aa6 Parents: 8294acf Author: Hanks <zhanghan...@gmail.com> Authored: Wed Aug 9 00:26:17 2017 +0800 Committer: Hanks <zhanghan...@gmail.com> Committed: Wed Aug 9 00:26:17 2017 +0800 ---------------------------------------------------------------------- html5/runtime/api/init.js | 77 +++++++++++++++++++-------------- html5/test/unit/default/runtime.js | 10 ++--- html5/test/unit/vanilla/index.js | 13 ------ 3 files changed, 49 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/bade9551/html5/runtime/api/init.js ---------------------------------------------------------------------- diff --git a/html5/runtime/api/init.js b/html5/runtime/api/init.js index d9a877f..cd8af86 100644 --- a/html5/runtime/api/init.js +++ b/html5/runtime/api/init.js @@ -32,16 +32,18 @@ const versionRegExp = /^\s*\/\/ *(\{[^}]*\}) *\r?\n/ * @param {string} code * @return {object} */ -function checkVersion (code) { - let info +function getBundleType (code) { const result = versionRegExp.exec(code) if (result) { try { - info = JSON.parse(result[1]) + const info = JSON.parse(result[1]) + return info.framework } catch (e) {} } - return info + + // default bundle type + return 'Weex' } function createServices (id, env, config) { @@ -66,6 +68,12 @@ function createServices (id, env, config) { const instanceMap = {} +function getFrameworkType (id) { + if (instanceMap[id]) { + return instanceMap[id].framework + } +} + /** * Check which framework a certain JS Bundle code based to. And create instance * by this framework. @@ -75,33 +83,35 @@ const instanceMap = {} * @param {object} data */ function createInstance (id, code, config, data) { - let info = instanceMap[id] + if (instanceMap[id]) { + return new Error(`invalid instance id "${id}"`) + } - if (!info) { - // Init instance info. - info = checkVersion(code) || {} - if (!frameworks[info.framework]) { - info.framework = 'Weex' - } + // Init instance info. + const bundleType = getBundleType(code) - // Init instance config. - config = JSON.parse(JSON.stringify(config || {})) - config.bundleVersion = info.version - config.env = JSON.parse(JSON.stringify(global.WXEnvironment || {})) - console.debug(`[JS Framework] create an ${info.framework}@${config.bundleVersion} instance from ${config.bundleVersion}`) - - const env = { - info, - config, - created: Date.now(), - framework: info.framework - } - env.services = createServices(id, env, runtimeConfig) - instanceMap[id] = env + // Init instance config. + config = JSON.parse(JSON.stringify(config || {})) + config.env = JSON.parse(JSON.stringify(global.WXEnvironment || {})) + + const context = { + config, + created: Date.now(), + framework: bundleType + } + context.services = createServices(id, context, runtimeConfig) + instanceMap[id] = context - return frameworks[info.framework].createInstance(id, code, config, data, env) + if (process.env.NODE_ENV === 'development') { + console.debug(`[JS Framework] create an ${bundleType} instance`) } - return new Error(`invalid instance id "${id}"`) + + const fm = frameworks[bundleType] + if (!fm) { + return new Error(`invalid bundle type "${bundleType}".`) + } + + return fm.createInstance(id, code, config, data, context) } const methods = { @@ -145,9 +155,10 @@ function checkComponentMethods (components) { function genInstance (methodName) { methods[methodName] = function (...args) { const id = args[0] - const info = instanceMap[id] - if (info && frameworks[info.framework]) { - const result = frameworks[info.framework][methodName](...args) + const type = getFrameworkType(id) + if (type && frameworks[type]) { + const result = frameworks[type][methodName](...args) + const info = { framework: type } // Lifecycle methods if (methodName === 'refreshInstance') { @@ -183,9 +194,9 @@ function genInstance (methodName) { function adaptInstance (methodName, nativeMethodName) { methods[nativeMethodName] = function (...args) { const id = args[0] - const info = instanceMap[id] - if (info && frameworks[info.framework]) { - return frameworks[info.framework][methodName](...args) + const type = getFrameworkType(id) + if (type && frameworks[type]) { + return frameworks[type][methodName](...args) } return new Error(`invalid instance id "${id}"`) } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/bade9551/html5/test/unit/default/runtime.js ---------------------------------------------------------------------- diff --git a/html5/test/unit/default/runtime.js b/html5/test/unit/default/runtime.js index 1aa0a8c..9a52fff 100644 --- a/html5/test/unit/default/runtime.js +++ b/html5/test/unit/default/runtime.js @@ -193,7 +193,7 @@ describe('framework entry', () => { expect(frameworks.xxx.createInstance.firstCall.args.slice(0, 4)).eql([ instanceId + '~', code, - { bundleVersion: '0.3.1', env: {}}, + { env: {}}, undefined ]) @@ -216,7 +216,7 @@ describe('framework entry', () => { expect(frameworks.Weex.createInstance.firstCall.args.slice(0, 4)).eql([ instanceId + '~~~', code, - { bundleVersion: undefined, env: {}}, + { env: {}}, undefined ]) @@ -237,7 +237,7 @@ describe('framework entry', () => { expect(frameworks.yyy.createInstance.firstCall.args.slice(0, 4)).eql([ instanceId + '~~~~', code, - { bundleVersion: undefined, env: {}}, + { env: {}}, undefined ]) @@ -250,7 +250,7 @@ describe('framework entry', () => { expect(frameworks.Weex.createInstance.secondCall.args.slice(0, 4)).eql([ instanceId + '~~~~~', code, - { bundleVersion: undefined, env: {}}, + { env: {}}, undefined ]) @@ -263,7 +263,7 @@ describe('framework entry', () => { expect(frameworks.Weex.createInstance.thirdCall.args.slice(0, 4)).eql([ instanceId + '~~~~~~', code, - { bundleVersion: undefined, env: {}}, + { env: {}}, undefined ]) http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/bade9551/html5/test/unit/vanilla/index.js ---------------------------------------------------------------------- diff --git a/html5/test/unit/vanilla/index.js b/html5/test/unit/vanilla/index.js index f2bd338..6389c4c 100644 --- a/html5/test/unit/vanilla/index.js +++ b/html5/test/unit/vanilla/index.js @@ -32,25 +32,12 @@ function clearRefs (json) { describe('vanilla test', () => { it('standard APIs', () => { expect(vanilla.init).to.be.a('function') - expect(vanilla.registerComponents).to.be.a('function') - expect(vanilla.registerModules).to.be.a('function') - expect(vanilla.registerMethods).to.be.a('function') - expect(vanilla.prepareInstance).to.be.a('function') expect(vanilla.createInstance).to.be.a('function') - expect(vanilla.refreshInstance).to.be.a('function') expect(vanilla.destroyInstance).to.be.a('function') expect(vanilla.getRoot).to.be.a('function') expect(vanilla.receiveTasks).to.be.a('function') }) - it('empty functions', () => { - expect(vanilla.registerComponents()).to.be.undefined - expect(vanilla.registerModules()).to.be.undefined - expect(vanilla.registerMethods()).to.be.undefined - expect(vanilla.prepareInstance()).to.be.undefined - expect(vanilla.refreshInstance()).to.be.undefined - }) - it('create & destroy instance', () => { const id = 'basic-demo' vanilla.init(runtime.config)