要使用ScrollMagic with GSAP,您需要加载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'
}
}
不幸的是,当你使用这个配置和上面的CommonJS语法时,ScrollMagic不断抛出错误。
(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin 'animation.gsap'. Please make sure to include plugins/animation.gsap.js
答案 0 :(得分:18)
解决方案
您必须通过添加以下用于停用define()
方法的加载程序来告诉Webpack停止使用AMD语法。
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(定义)和 CommonJS(require)语法。这就是plugins/animation.gsap.js
中的以下工厂脚本跳转到第一个if语句并静默失败的原因。这就是为什么永远不会将setTween()
等添加到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);
}
我希望这可以防止其他人花一整晚来试图弄清楚发生了什么。
答案 1 :(得分:1)
medoingthings解决方案已将语法更改为包含“-loader”后缀。
module: {
loaders: [
{ test: /\.js$/, loader: 'imports-loader?define=>false'}
]
}
https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed
答案 2 :(得分:1)
我遇到的解决方案不需要您更改webpack.config.js文件,并且实际上对我有用,可以在以下位置找到:https://github.com/janpaepke/ScrollMagic/issues/665
要点是确保您已通过npm(希望很明显)添加了ScrollMagic和GSAP,以及imports-loader:
npm install --save scrollmagic gsap
npm install --save-dev imports-loader
然后在要与GSAP一起使用ScrollMagic的文件中进行以下导入:
import { TimelineMax, TweenMax, Linear } from 'gsap';
import ScrollMagic from 'scrollmagic';
import 'imports-loader?define=>false!scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap';
使用Webpack 4.x和imports-loader 0.8.0
答案 3 :(得分:1)
在imports-loader 1.1.0中,配置的语法有所变化,因此现在您必须使用以下命令来使ScrollMagic插件正常工作:
{
test: [
path.join(config.root, '/node_modules/scrollmagic/scrollmagic/uncompressed/plugins/jquery.ScrollMagic.js'),
path.join(config.root, '/node_modules/scrollmagic/scrollmagic/uncompressed/plugins/debug.addIndicators.js')
],
use: [
{
loader: 'imports-loader',
options: {
additionalCode: 'var define = false;'
}
}
]
}
希望这对其他人有帮助。
答案 4 :(得分:0)
我遇到了同样的问题并发现了这个问题。
对于那些使用 Webpack 5 的人,我认为 import-loader 已经过时了,所以根据 webpack 文档将此代码添加到您的 js 规则中以禁用 AMD:
{
test: /\.js$/,
include: /node_modules/,
parser: {
amd: false
}
}