@cooby/crx-load-script-webpack-plugin
Version:
A webpack plugin overrides the default load script mechanism for Chrome Extension. Useful for Chrome Extension developers that are trying to lazyload scripts or using HMR when working with the Webpack dev server.
56 lines (49 loc) • 1.81 kB
JavaScript
const { MESSAGE_TYPES } = require('./constants')
const RuntimeGlobals = require('webpack/lib/RuntimeGlobals');
const Template = require('webpack/lib/Template');
const HelperRuntimeModule = require('webpack/lib/runtime/HelperRuntimeModule');
class LoadScriptRuntimeModule extends HelperRuntimeModule {
constructor() {
super('load script');
}
generate() {
const { compilation } = this;
const { runtimeTemplate, outputOptions } = compilation;
const { uniqueName } = outputOptions;
const fn = RuntimeGlobals.loadScript;
return Template.asString([
'var loadedScripts = {};',
'var inProgress = {};',
uniqueName
? `var dataWebpackPrefix = ${JSON.stringify(uniqueName + ':')};`
: '// data-webpack is not used as build has no uniqueName',
'// loadScript function to load a script by asking background script run chrome.runtime.executeScript',
`${fn} = ${runtimeTemplate.basicFunction('url, done, key, chunkId', [
'if(inProgress[url]) { inProgress[url].push(done); return; }',
'inProgress[url] = [done];',
'if(loadedScripts[url]) return;',
'loadedScripts[url] = true;',
'chrome.runtime.sendMessage({',
Template.indent([
`type: '${MESSAGE_TYPES.LOAD_SCRIPT}',`,
'payload: {',
Template.indent([
`file: url.replace(${RuntimeGlobals.publicPath},'')`,
]),
'}',
]),
'}, () => {',
Template.indent([
'var doneFns = inProgress[url];',
'delete inProgress[url];',
`doneFns && doneFns.forEach(${runtimeTemplate.returningFunction(
'fn(event)',
'fn'
)});`,
]),
'})',
])};`,
]);
}
}
module.exports = LoadScriptRuntimeModule;