У меня распределенная система, и все JS файлы доступны через HTTP. Таким образом, обычный модуль будет выглядеть так:
http://example.com/path/to/main.js
import * as core from 'http://local.example.com/path/to/core.js';
import * as redux from 'http://cdn.example.com/redux.js@version';
// code
export default {
...
}
Таким образом, каждый импорт будет использовать либо локальный ресурс системы, либо, возможно, удаленно доступный ресурсы, использующие CDN.
Мысль, когда я запускаю webpack, я получаю эту ошибку:
пытается проанализировать локальный сгенерированный файл с таким содержимым:
import * as main from 'http://example.com/path/to/main.js';
ОШИБКА в ./src/index.js Модуль не найден: Ошибка: невозможно разрешить 'http://example.com/path/to/main.js' в '/home/.../index.js'
Можно ли сказать веб-пакету, чтобы он извлек URL-адреса и включил их в пакет ... Хотя упаковка URL-адресов CDN пока не имеет большого значения, я был бы рад, если бы я мог просто игнорировать их с определенным URL.
Мысль о возможности связать удаленно все файлы, расположенные в http: //, будет хорошим началом.
Кроме того, любой удаленный ресурс, ссылающийся на другие ресурсы, должен рекурсивно загружаться удаленно. связанные ресурсы тоже.
Вот мой текущий конфиг веб-пакета (ничего особенного ere):
const path = require('path');
module.exports = {
mode: 'development',
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
]
},
};
Редактировать: после прочтения я начал писать распознаватель, но теперь снова застрял:
const path = require('path');
const fetch = require('node-fetch');
const url = require('url')
const fs = require('promise-fs');
const sha1 = require('sha1')
class CustomResolver {
async download_save(request, resolveContext) {
console.log(request, resolveContext)
var target = url.parse(request.request)
var response = await fetch(request.request)
var content = await response.text()
try {
await fs.stat('_remote')
} catch(exc) {
await fs.mkdir('_remote')
}
var filename = `${sha1(request.request)}.js`
var file_path = `_remote/${filename}`
await fs.writeFile(file_path, content)
var abs_path = path.resolve(file_path)
var url_path = `${target.protocol}://${target.hostname}/`
var obj = {
path: abs_path,
request: request.request,
query: '',
}
console.log(`${request.request} saved to ${abs_path}`)
return obj
}
apply(resolver) {
var self = this
const target = resolver.ensureHook("resolved")
resolver.getHook("module")
.tapAsync("FetchResolverPlugin", (request, resolveContext, callback) => {
self.download_save(request, resolveContext)
.then((obj) => resolver.doResolve(target, obj, resolveContext, callback))
.catch((err) => {
console.log(err)
callback()
})
})
}
}
В настоящее время он получает URL-адреса, начиная с https: // но, похоже, изо всех сил пытается разрешить URL относительно ресурса http. Например,
ERROR in _remote/88f978ae6c4a58e98a0a39996416d923ef9ca531.js
Module not found: Error: Can't resolve '/-/@pika/polyfill@v0.0.3/dist=es2017/polyfill.js' in '_remote/'
@ _remote/88f978ae6c4a58e98a0a39996416d923ef9ca531.js 25:0-58
@ _remote/f80b922b2dd42bdfaaba4e9f4fc3c84b9cc04fca.js
@ ./src/index.js
Не похоже, что он пытается разрешить относительный путь к уже разрешенным файлам. Есть ли способ сказать решателю, чтобы попытаться разрешить все?