Как использовать ScrollMagic с GSAP и Webpack

чтобы использовать ScrollMagic с "ГСАП", вам нужно загрузить animation.gsap.js плагин. С Webpack вы сделали бы что-то подобное, чтобы выполнить это (предполагая, что вы используете синтаксис CommonJS и установили все с npm):

var TweenMax = require('gsap');
var ScrollMagic = require('scrollmagic');
require('ScrollMagicGSAP');

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

resolve: {
  alias: {
    'ScrollMagicGSAP': 'scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap'
  }
}

к сожалению, ScrollMagic продолжает бросать ошибка, когда вы используете эту конфигурацию и синтаксис CommonJS, как указано выше.

(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin 'animation.gsap'. Please make sure to include plugins/animation.gsap.js

3 ответов


Решение

вы должны сказать Webpack прекратить использовать синтаксис AMD, добавив следующий загрузчик, который деактивирует define() метод.

module: {
  loaders: [
    { test: /\.js$/, loader: 'imports-loader?define=>false'}

    // Use this instead, if you’re running Webpack v1
    // { test: /\.js$/, loader: 'imports?define=>false'}
  ]
}

не забудьте установить загрузчик с npm install imports-loader --save-dev .

почему?

проблема заключается в том, что Webpack поддерживает AMD (define) и синтаксис CommonJS (require). Вот почему следующий фабричный скрипт внутри plugins/animation.gsap.js прыжки в первое утверждение if и терпит неудачу молча. Вот почему setTween() etc. никогда не добавляются в конструктор ScrollMagic.

сообщив Webpack не поддерживать синтаксис AMD (используя упомянутый выше загрузчик), плагин переходит во второй оператор if правильно, охватывая синтаксис CommonJS.

if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['ScrollMagic', 'TweenMax', 'TimelineMax'], factory);
} else if (typeof exports === 'object') {
    // CommonJS
    // Loads whole gsap package onto global scope.
    require('gsap');
    factory(require('scrollmagic'), TweenMax, TimelineMax);
} else {
    // Browser globals
    factory(root.ScrollMagic || (root.jQuery && root.jQuery.ScrollMagic), root.TweenMax || root.TweenLite, root.TimelineMax || root.TimelineLite);
}

Я надеюсь, что это мешает другим людям провести целый вечер, пытаясь понять, что происходит.


решение medoingthings с тех пор изменило синтаксис, чтобы включить суффикс "-loader".

module: {
 loaders: [
   { test: /\.js$/, loader: 'imports-loader?define=>false'}
 ]
}

https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed


решение, с которым я столкнулся, не требует изменения вашего webpack.конфиг.JS файл и на самом деле работает для меня можно найти здесь:https://github.com/janpaepke/ScrollMagic/issues/665

суть в том, чтобы убедиться, что у вас есть ScrollMagic и GSAP, добавленные через npm (надеюсь, это очевидно), а также imports-loader:

npm install --save scrollmagic gsap
npm install --save-dev imports-loader

затем в файле, который вы хотите использовать ScrollMagic с GSAP, выполните следующие импорта:

import { TimelineMax, TweenMax, Linear } from 'gsap';
import ScrollMagic from 'scrollmagic';
import 'imports-loader?define=>false!scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap';

используя Webpack 4.x и импорт-загрузчик 0.8.0