Bootstrap 4 Бета-импорт Popper.js с помощью Webpack 3.x throws Popper не является конструктором

Итак, Bootstrap 4 Beta выходит... yey! Однако Tether был заменен на Popper.js для всплывающей подсказки (и других функций). Я достаточно быстро обнаружил ошибку в консоли, чтобы сообщить мне об изменении на Popper.js:

Bootstrap dropdown require Popper.js

Кажется, достаточно легко, я пошел и обновил мой webpack.config.js (весь конфиг можно увидеть здесь), и Bootstrap затем начал работать ( только изменение я сделал, чтобы заменить Tether с Поппера):

plugins: [
new ProvidePlugin({
  'Promise': 'bluebird',
  '$': 'jquery',
  'jQuery': 'jquery',
  'window.jQuery': 'jquery',
  'window.$': 'jquery',
  Popper: 'popper.js' 
}),

Я также сделал import 'bootstrap' в моем main.ts файле.

Однако теперь у меня есть другая проблема (которой у меня не было с Tether), в консоль добавлена ​​новая ошибка:

Uncaught TypeError: Popper is not a constructor

Если я попытаюсь выполнить отладку в Chrome, у меня есть Popper, загруженный как объект (поэтому Bootstrap перестает жаловаться), как вы можете видеть на экране печати ниже. введите описание изображения здесь

Наконец, чтобы включить весь мой код. Я использую всплывающую подсказку Bootstrap с простым пользовательским элементом, созданным с помощью Aurelia и TypeScript (который использовался для работы с предыдущим бутстрапом alpha 6 и Tether)

import {inject, customAttribute} from 'aurelia-framework';
import * as $ from 'jquery';

@customAttribute('bootstrap-tooltip')
@inject(Element)
export class BootstrapTooltip {
  element: HTMLElement;

  constructor(element: HTMLElement) {
    this.element = element;
  }

  bind() {
    $(this.element).tooltip();
  }

  unbind() {
    $(this.element).tooltip('dispose');
  }
}

Похоже, что я не импортировал Popper правильно, если да, то какой лучший способ достичь этого с помощью Webpack 3.x?

Ответ 1

При просмотре документации Bootstrap 4. Я действительно нашел раздел о Webpack, в котором объясняется, как правильно установить его. Следуя документации Bootstrap - установка с помощью Webpack, нужно просто изменить webpack.config.js следующим образом:

plugins: [
  // ...
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    'window.jQuery': 'jquery',
    Popper: ['popper.js', 'default']
  })
  // ...
]

и не забывайте import его в main.ts

import 'bootstrap';

и вуаля! Мы вернулись в бизнес:)

Ответ 2

Я просто столкнулся с той же проблемой, и решение описано здесь: https://github.com/FezVrasta/popper.js/issues/287

Теперь мой main.ts выглядит примерно так:

import "jquery";
import Popper from "popper.js";

(<any>window).Popper = Popper;

require("bootstrap");

И мне пришлось запустить npm install @types/requirejs --save, чтобы вызвать вызов require.

EDIT: я полностью пропустил это в первый раз, но в документе действительно есть лучший способ решить эту проблему https://getbootstrap.com/docs/4.0/getting-started/webpack/

plugins: [
  ...
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    'window.jQuery': 'jquery',
    Popper: ['popper.js', 'default'],
    // In case you imported plugins individually, you must also require them here:
    Util: "exports-loader?Util!bootstrap/js/dist/util",
    Dropdown: "exports-loader?Dropdown!bootstrap/js/dist/dropdown",
    ...
  })
  ...
]

Ответ 3

Если вы используете Webpack Сделайте это:

window.$ = window.jQuery = require('jquery');
window.Popper = require('popper.js').default; // pay attention to "default"
require('bootstrap/dist/js/bootstrap');

Ответ 4

В проекте ASP.net Core 2 добавьте следующие сценарии к основному файлу HTML (файл "_Layout.cshtml" )

<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/js/popper.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.min.js"></script>

Для меня это работает.