4

私が使用しているJSライブラリは3つあり、それらはそれぞれ別のファイルにあります。それらは、個々のファイルで縮小されたコードでコメント化されます

file 1: http://jsfiddle.net/NGMVa/

file 2: http://jsfiddle.net/AzEME/

file 3: http://jsfiddle.net/qVkhn/

これで、個別にアプリで正常に動作するようになりました。エラーをスローしないでください。しかし、ロードするファイルを減らしたかったので、次のようにそれらを1つのファイルに結合しました:http://jsfiddle.net/Gxswy/

ただし、Chromeでは、ファイルの最後の行にエラーがスローされます。

Uncaught TypeError: undefined is not a function 

そしてそれはもう機能しません。結合する前にコードを変更せず、最初の3つのファイルの内容をコピーして新しいファイルに貼り付けただけで、機能しなくなりました。それらを1つのファイルに結合すると機能が損なわれるように見える理由がわかりません

誰かがここで何が起こっているのか考えてくれることを望んでいましたか?

4

2 に答える 2

6

各ファイルの最後にセミコロンを追加するか、連結してから、minifyとminifierがそれを処理する必要があります。

このコードを試してください:https ://gist.github.com/elclanrs/4728677

于 2013-02-07T04:57:53.707 に答える
0

理由

私の場合、既に AMD の読み込みをサポートしているライブラリ ( ) に対して、requirejsので依存関係を指定したことが原因でした。その結果、ジョブの実行後にコード全体がバイパスされます。shimperfect-scrollbardefinegrunt-contrib-requirejs

基本的に、requirejs ファイルを連結するにgrunt-contrib-requirejsは、

// change this:
define(['d3'],function(d3){...});

// into this:
define('d3', ['d3'],function(d3){...});

内部perfect-scrollbarには、すでに

(function (factory) {
  'use strict';

  if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.

    define(['jquery'], factory); // <-------------------------- this part
    // after minification would become:
    // define('PerfectScrollbar', ['jquery'], factory);

  } else if (typeof exports === 'object') {
    factory(require('jquery')); // Node/CommonJS
  } else {
    factory(jQuery); // Browser globals
  }
}(function ($) {
  // perfect-scrollbar code here...
});

で指定したものと競合しましたshim

shim: {
    "PerfectScrollbar": ['jquery', 'jquery.mousewheel']
}

そのため、実際に定義さrequirejsれた部分にPerfectScrollbar到達すると、既にその作業を行っていると想定して、その部分を飛び越えました。

解決

shim既に AMD をサポートしているライブラリの依存関係を指定しないでください。

質問

しかし、依存関係を指定する必要がある場合はどうすればよいでしょうか? コードですでに指定されているjquery.mousewheel上に必要です。jquery

答え

そのファイルに適切な require を要求し、独自の依存関係を正しく取得します。

define(['perfect-scrollbar', 'jquery.mousewheel'], function(){...});

必要なライブラリが AMD をサポートしている場合、

// inside jquery.mousewheel:
require(['jquery'], factory);

または、そうではありません

shim: {
    "IDontSupportAMD": ['jquery']
}
于 2014-09-19T05:28:18.927 に答える