WebPack: требуется файл JavaScript в глобальной области видимости
Как я могу require()
библиотека поставщика в глобальном масштабе (с помощью упаковщика WebPack)? Независимо от того, имеет ли он exports
определения или нет. Мне просто нужна библиотека, чтобы некоторые другие скрипты на странице также могли ее использовать.
Я нашел возможное решение с помощью script-loader
лайк:
require('script-loader!./some-vendor-library.js');
И все работает отлично, но ключевым недостатком этого решения является то, что включенный скрипт фактически оценивается через eval()
функция: код библиотеки вендора добавляется в конец bundle.js
как строка (а не как реальный код). Есть ли аналогичное решение для библиотеки, которая будет включена в конечный комплект как код, а не как строка?
PS Иногда мне нужно делать это динамически, поэтому я не могу добавить это в конфигурацию веб-пакета.
1 ответ
Script-loader
к сожалению, оборачивает включенные скрипты в строку, поэтому вы можете оценить его, используя Blob или что-то подобное. Но я думаю, что вы можете попробовать что-то еще.
Во-первых: убедитесь, что ваш require("./path/to/a-neat-module.js")
на самом деле тянет в файл. Перейдите к полученному пакету и просмотрите код для подтверждения. Если возможно, используйте npm для установки любых библиотек, так что вы можете просто и просто вызвать require("a-neat-module")
Итак, как я могу сделать так, чтобы мои неэкспортированные переменные и функции были доступны?
Вы не можете напрямую.
В ваших входных файлах вызов этого сделает все экспортированные переменные, динамически доступными в ./js
папки и подкаталоги, выставленные:
function requireAll(requireContext) {
return requireContext.keys().map(requireContext);
}
var jsModules = requireAll(require.context("./js", true, /\.js$/));
Или, если у вас есть определенный модуль и глобальный в виду:
window["silly"] = require("./js/silly.js");
window["$"] = window["jQuery"] = require("jquery");
Но если ваши файлы не экспортируются, это просто добавляет размер к вашему пакету. Просто подумайте о том, как код экспортируется в ваш окончательный комплект. Все это упаковано, поэтому любые переменные, определенные в глобальной области видимости, становятся локальными для функции переноса.
Так вот, где загрузчики и плагины, как script-loader
а также globals-loader
войти. Они помогают предварительно обработать ваши файлы, чтобы они были доступны вам позже.
Кроме них, я не знаю ни одного плагина, который бы помогал динамически преобразовывать ваш неэкспортированный код путем перевода. Возможно, стоит попытаться переписать некоторые из них для поддержки модульного формата. Я знаю, что это не очень хорошая новость, но, возможно, стоит подумать о том, сколько времени потребуется, чтобы сделать ваш javascript модульным. С этим потоком проектирования почти каждая библиотека js стоит своих функций, чтобы избежать проблем с импортом.
Ps: вы проверили эффекты ouput.libraryTarget: "this"
в твоем конфиге? Некоторые люди имели успех с этим.
PPs: Вы проверили webpack-raw-bundler? Он вставит ваш код в другой файл с сохраненной глобальной областью действия, но он будет в другом файле, чтобы вы могли запустить посткомпиляцию, чтобы объединить их в конце. Я запускаю это для нескольких файлов внешнего интерфейса, чтобы их неэкспортированные функции были доступны, как если бы каждый из файлов был включен в свои собственные <script>
теги. Однако вы должны быть осторожны со временем загрузки и перегрузкой метода.