UNPKG

@mpxjs/webpack-plugin

Version:

mpx compile core

75 lines (71 loc) 2.46 kB
const RuntimeGlobals = require('webpack/lib/RuntimeGlobals') const Template = require('webpack/lib/Template') const HelperRuntimeModule = require('webpack/lib/runtime/HelperRuntimeModule') class LoadAsyncChunkRuntimeModule extends HelperRuntimeModule { constructor (timeout) { super('load async chunk') this.timeout = timeout || 10000 } generate () { const { compilation } = this const { runtimeTemplate } = compilation const loadScriptFn = RuntimeGlobals.loadScript return Template.asString([ 'var inProgress = {}', `${loadScriptFn} = ${runtimeTemplate.basicFunction( 'url, done, key, chunkId', [ `var packageName = ${RuntimeGlobals.getChunkScriptFilename}(chunkId) || ''`, 'packageName = packageName.split(\'/\').slice(0, -1).join(\'/\')', 'var config = {', Template.indent([ 'url: url,', 'package: packageName' ]), '}', 'if(inProgress[url]) {', Template.indent([ 'inProgress[url].push(done)', 'return' ]), '}', 'inProgress[url] = [done]', 'var callback = function (type, result) {', Template.indent([ 'var event = {', Template.indent([ 'type: type || \'fail\',', 'target: {', Template.indent(['src: url']), '}' ]), '}' ]), Template.indent([ 'var doneFns = inProgress[url]', 'clearTimeout(timeout)', 'delete inProgress[url]', `doneFns && doneFns.forEach(${runtimeTemplate.returningFunction( 'fn(event)', 'fn' )})` ]), '}', `var timeout = setTimeout(callback.bind(null, 'timeout'), ${this.timeout})`, 'var loadChunkAsyncFn = global.__mpx.config.rnConfig && global.__mpx.config.rnConfig.loadChunkAsync', 'try {', Template.indent([ 'loadChunkAsyncFn(config).then(callback).catch(callback)' ]), '} catch (e) {', Template.indent([ 'console.error(\'[Mpx runtime error]: please provide correct mpx.config.rnConfig.loadChunkAsync implemention!\', e)', 'Promise.resolve().then(callback)' ]), '}' ] )}` ]) } } module.exports = LoadAsyncChunkRuntimeModule