6

我对 Foundation 6.4 中的 javascript 失去了理智。我不知道这个 Webpack 是怎么回事。似乎有些库/插件可以工作,而有些则不能。我的最新问题是关于 plyr ( https://plyr.io/ )。我不明白为什么 TweenMax 可以 100% 正常工作而 plyr.js 不能。我究竟做错了什么?

这是我得到的错误..

app.js:23026 Uncaught ReferenceError: plyr is not defined

这就是我的app.js样子。。

import $ from 'jquery';
import whatInput from 'what-input';


window.$ = $;
window.jQuery = $;


require('./TweenMax.js');
require('./plyr.js');


//import Foundation from 'foundation-sites';
// If you want to pick and choose which modules to include, comment out the above and uncomment
// the line below
import './lib/foundation-explicit-pieces';

$(document).foundation().ready(function(){

    TweenMax.set(".logo-center", {transformOrigin:"50% 50%"});

    var blast = plyr.setup('#blast', {
        hideControls: true,
        clickToPlay: false,
        controls: []
    }); 
});

我的 config.yml 文件中也有 plyr.js 的路径:

# Your project's server will run on localhost:xxxx at this port
PORT: 8000

# Autoprefixer will make sure your CSS works with these browsers
COMPATIBILITY:
  - "last 2 versions"
  - "ie >= 10"
  - "ios >= 9"

# UnCSS will use these settings
UNCSS_OPTIONS:
  html:
    - "src/**/*.html"
  ignore:
    - !!js/regexp .foundation-mq
    - !!js/regexp ^\.is-.*

# Gulp will reference these paths when it copies files
PATHS:
  # Path to dist folder
  dist: "dist"  
  # Paths to static assets that aren't images, CSS, or JavaScript
  assets:
    - "src/assets/**/*"
    - "!src/assets/{img,js,scss}/**/*"
  # Paths to Sass libraries, which can then be loaded with @import
  sass:
    - "node_modules/foundation-sites/scss"
    - "node_modules/motion-ui/src"
  # Paths to JavaScript entry points for webpack to bundle modules
  entries:
    - "src/assets/js/app.js"
    - "src/assets/js/plyr.js"
    - "src/assets/js/TweenMax.js"
4

3 回答 3

5

我假设您从ZURB 模板开始您的 Foundation 项目。它使用Gulpfile ( gulpfile.babel.js) 将 JavaScript 模块与 Webpack 捆绑在一起。

在这个脚本里面有一个如下的Webpack 配置

let webpackConfig = {
  module: {
    rules: [
      {
        test: /.js$/,
        use: [
          {
            loader: 'babel-loader'
          }
        ]
      }
    ]
  }
}

Webpack config 可以在模块部分定义模块的一些规则(配置加载器、解析器选项等)。特别是加载器使 webpack 能够处理文件并捆绑它们(或执行其他 Webpack 任务)。

所以具体的配置gulpfile.babel.js告诉 Webpack 对/src 文件夹中所有带有js扩展名的文件使用babel-loader 。然而,正如Webpack 中所解释的 - 填充一些模块/库可能需要全局依赖项(例如 $ 用于 jQuery)或创建需要导出的全局变量。

要支持这些库,例如Plyr,您可以使用expose-loader。所以在 Webpack 配置里面添加一个模块规则 gulpfile.babel.js,指向暴露加载plyr.js

let webpackConfig = {
  module: {
    rules: [
      {
        test: /plyr.js/,
        use: [
          {
            loader: 'expose-loader',
            options: 'plyr'
          }
        ]
      },
      {
        test: /.js$/,
        use: [
          {
            loader: 'babel-loader'
          }
        ]
      }
    ]
  }
}

不需要对您的项目文件(config.yml、app.js)进行其他更改。

这样你应该plyr像在你的全局变量一样访问app.js

var blast = plyr.setup('#blast', {
    hideControls: true,
    clickToPlay: false,
    controls: []
}); 
于 2018-02-09T12:53:04.393 回答
1

如果没有实际的项目代码,很难弄清楚出了什么问题。但这是我对这种情况的看法。

首先,为什么要从本地文件导入 plyr?不应该是require('plyr')代替require('./plyr.js')

另外,当模块将库导出为 时,为什么要使用plyr小写的“p”,Plyr在全局绑定中使用大写的“P”,即绑定在window.

你的代码:

plyr.setup('#blast', {
    ...
}); 

plyr 模块:

! function (e, t) {
    "object" == typeof exports && "undefined" != typeof module
        ? module.exports = t() // commonjs
        : "function" == typeof define && define.amd
            ? define("Plyr", t) // requirejs
            : e.Plyr = t() // window/global binding
}(this, function () {
    ...
});

在这里这里完全转储。来源在这里

您可以通过在加载代码之前加载并使用全局绑定来使其工作plyr.jsindex.htmlPlyr

// index.html
<html>
<head>
    <script src="plyr.js"></script> // window.Plyr = ...
</head>
<body>
    ...
    <script src="bundle.js"></script>
</body>
</html>


//main.js
...
Plyr.setup('#blast', {
    hideControls: true,
    clickToPlay: false,
    controls: []
});

您还可以将plyr代码中的模块作为命名 import 导入

import Plyr from 'plyr';

...

Plyr.setup('#blast', {
    hideControls: true,
    clickToPlay: false,
    controls: []
});

如果这一切仍然不起作用,我相信你最好分享你的项目代码 - 至少比你过去所做的更多。

于 2018-02-09T10:36:18.193 回答
1

您可能需要使用诸如expose-loader之类的东西,以便plyrwindow. 这是有关我们如何在项目中使用暴露加载器的更多信息。

于 2018-02-04T05:26:36.747 回答