Синхронное требование в Webpack

Я использую webpack, и я использую require, чтобы вытащить некоторые пакеты. У меня есть два пакета: пакет1.js и package2.js. пакет1.js просто создает объект с некоторыми свойствами, называемыми pkg1. package2-это файл javascript, содержащий самоисполняющуюся функцию, которая расширяет package1. Е. Г.

package2.js:

!function () {
    pkg1.prototype.newFunction = function {return "foo"};
}()

Я пытаюсь потребовать оба из них в новый сценарий следующим образом:

require('package1')
require('package2')

когда я это делаю, я получаю ошибка:

Uncaught TypeError: pkg1.newFunction is not a function

Я думаю, что это из-за асинхронной загрузки Javascripts:require(package2) выполняется перед require('package1'). Мое доказательство этого заключается в том, что когда я делаю следующее, Я не получаю ошибку:

require('package1')
!function () {
    pkg1.prototype.newFunction = function {return "foo"};
}()

однако это очень грязно, и я хотел бы использовать require. Как я смогу это сделать?

Edit: Конкретные Примеры

на листовка-Д3 плагин начинается с:

(function() {
    L.HexbinLayer = L.Class.extend({
    ...
 })()

следовательно, по крайней мере, в моем понимании, положить в require(leaflet-d3-plugin) должен заставить этот скрипт выполняться и расширяться L который принес require('leaflet')

аналогично, d3-hexbin-v0 начинается с:

!function(){d3.hexbin=function(){
    ...
}}()

опять же, как я читаю это, этот скрипт просто добавляет .hexbin метод d3.

теперь, если бы я просто писал html, я бы просто поместил эти разные вещи в различные теги скриптов и это просто работает:

<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://d3js.org/d3.hexbin.v0.min.js"></script>

или

<script src="http://cdn.leafletjs.com/leaflet-0.7/leaflet.js"></script>
<script src="static/leaflet-d3.min.js" charset="utf-8"></script>

но поскольку я использую webpack, я должен просто иметь возможность требовать и / или импортировать эти библиотеки после их установки с npm или просто скопировать .js в этих скриптах в некоторый каталог, а затем require их из этого места. К сожалению, это не работает, если я не копирую .js в этих модулях непосредственно в любой сценарий, который я пишу. Это то, что я пытаюсь избегать.

Е. Г.

import * as d3 from 'd3'; I'm using d3 v4 here.
require('/resources/d3-hexbin.min.js')

результаты:

Uncaught TypeError: d3.hexbin is not a function

1 ответов


Webpack загружает его синхронно, но каждый файл имеет свою область применения.

вот почему в своем заявлении

import * as d3 from 'd3'; \I'm using d3 v4 here.
require('/resources/d3-hexbin.min.js')

ваш второй не найти d3 переменной.

вы можете решить с помощью ProvidePlugin:

webpack.конфиг.js

plugins: [
  new webpack.ProvidePlugin({
    d3: 'd3'
  }),
  ... //other plugins

таким образом d3 будет доступна в приложении.

альтернативный способ достичь этого-использовать следующее:

import * as d3 from 'd3';
window.d3 = d3;
require('./d3.hexbin.v0.min.js')

надеюсь, что это помогает тебе!