Я разрабатываю расширение для Chrome в формате amd. В качестве сборщика js я использую webpack. Я извлек несколько записей, webpack создал для них несколько фрагментов. Моя цель — добиться загрузки чанка в контексте content_script. По умолчанию функция webpack_require.ensure создаст новый тег script с правильным исходным кодом и внедрит его в dom:
__webpack_require__.e = function requireEnsure(chunkId, callback) {
/******/ // "0" is the signal for "already loaded"
/******/ if(installedChunks[chunkId] === 0)
/******/ return callback.call(null, __webpack_require__);
/******/
/******/ // an array means "currently loading".
/******/ if(installedChunks[chunkId] !== undefined) {
/******/ installedChunks[chunkId].push(callback);
/******/ } else {
/******/ // start chunk loading
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.async = true;
/******/
/******/ script.src = __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".chunk.js";
/******/ head.appendChild(script); // INJECT INTO DOM
/******/ }
/******/ };
В моем случае я хотел бы загрузить чанк как отдельный запрос (как сейчас), но выполнить его в контексте текущего кода content_script: функция eval.
Чтобы получить что-то вроде этого:
/******/ __webpack_require__.e = function requireEnsure(chunkId, callback) {
/******/ // "0" is the signal for "already loaded"
/******/ if(installedChunks[chunkId] === 0)
/******/ return callback.call(null, __webpack_require__);
/******/
/******/ // an array means "currently loading".
/******/ if(installedChunks[chunkId] !== undefined) {
/******/ installedChunks[chunkId].push(callback);
/******/ } else {
/******/ // start chunk loading
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var src = __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".chunk.js";
/******/ var url = chrome.extension.getURL(src);
/******/ var xhr = new XMLHttpRequest(),
/******/ evalResponseText = function (xhr) {
/******/ eval(xhr.responseText + '//# sourceURL=' + url); // execute chunk's code in context of content_script
/******/ // context.completeLoad(moduleName);
/******/ };
/******/ xhr.open('GET', url, true);
/******/ xhr.onreadystatechange = function (e) {
/******/ if (xhr.readyState === 4 && xhr.status === 200) {
/******/ evalResponseText.call(window, xhr);
/******/ }
/******/ };
/******/ xhr.send(null); // get chunk
/******/
/******/ }
Я уже решил это путем внедрения собственного плагина в процесс компиляции. Вопрос, можно ли добиться этого "законным" (более простым) способом? Или не использовать кастомный плагин и это можно решить кастомным загрузчиком?
Большое спасибо за любые идеи.