Ошибка «определить нельзя использовать косвенно» при комплектации с Webpack - PullRequest
5 голосов
/ 09 мая 2019

Когда я пытаюсь связать свой код, написанный на AMD, я получаю ошибку Uncaught Error: define cannot be used indirect, как только я использую функцию define().Как я могу решить это?Нельзя изменить define() на import, поскольку весь проект написан на RequireJS AMD

Это моя конфигурация Webpack:

const path = require("path");

module.exports = {
    entry: {
        app: './app/js/app/main.js'
    },
    output: {
        path: path.resolve(__dirname, 'app/build'),
        filename: 'main.js'
    },
    module: {
        rules: [{
            test: /\.js?$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            query: {
                presets: ['@babel/env']
            }
        }]
    }
};

Мой входной файл:

define('app', [
    'lib/angular',
    'lib/has',
], function (angular, has) {
    'use strict';

    return angular.module('app', ['ngAnimate', 'ngSanitize', 'angular-require'])

}, function(error) {
    console.error(error);
});

Это вывод, который он мне дает:

!function (e) {
    var n = {};

    function r(t) {
        if (n[t]) return n[t].exports;
        var o = n[t] = {i: t, l: !1, exports: {}};
        return e[t].call(o.exports, o, o.exports, r), o.l = !0, o.exports
    }

    r.m = e, r.c = n, r.d = function (e, n, t) {
        r.o(e, n) || Object.defineProperty(e, n, {enumerable: !0, get: t})
    }, r.r = function (e) {
        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}), Object.defineProperty(e, "__esModule", {value: !0})
    }, r.t = function (e, n) {
        if (1 & n && (e = r(e)), 8 & n) return e;
        if (4 & n && "object" == typeof e && e && e.__esModule) return e;
        var t = Object.create(null);
        if (r.r(t), Object.defineProperty(t, "default", {
            enumerable: !0,
            value: e
        }), 2 & n && "string" != typeof e) for (var o in e) r.d(t, o, function (n) {
            return e[n]
        }.bind(null, o));
        return t
    }, r.n = function (e) {
        var n = e && e.__esModule ? function () {
            return e.default
        } : function () {
            return e
        };
        return r.d(n, "a", n), n
    }, r.o = function (e, n) {
        return Object.prototype.hasOwnProperty.call(e, n)
    }, r.p = "", r(r.s = 0)
}([function (e, n, r) {
    var t;
    void 0 === (t = function () {
        "use strict";
        r(1)("app", ["lib/angular", "lib/has"], function (e, n) {
            return e.module("app", ["ngAnimate", "ngSanitize", "angular-require"])
        }, function (e) {
            console.error(e)
        })
    }.apply(n, [])) || (e.exports = t)
}, function (e, n) {
    e.exports = function () {
        throw new Error("define cannot be used indirect")
    }
}]);

Однако файл ввода импортируется конфигурационным файлом RequireJS:

var bower_components = bower_components || 'bower_components';

require.config({
    paths: {
        'lib/angular': bower_components + '/angular/angular.min',
        'lib/angular-animate': bower_components + '/angular-animate/angular-animate.min',
        'lib/sprintf': bower_components + '/sprintf/dist/sprintf.min',
        'lib/twitter-text': bower_components + '/twitter-text-js/js/twitter-text',
        'lib/jsdiff': bower_components + '/jsdiff/diff',
        es6: "lib/requirejs-babel/es6",
        babel: "lib/requirejs-babel/babel-5.8.34.min",
        'babel-plugin-module-resolver': 'lib/babel-plugin-module-resolver-standalone/index'
    },
    babel:{
        fileExtension: ".js"
    },
    packages: [{
            name: 'app',
            location: 'build' //This directs to the file compiled by webpack
        }, {
            name: 'app/blogLegacy',
            location: 'apps/blog-legacy'
        },{
            name: 'app/blog',
            location: 'apps/blog-modular'
        },{

EDIT

Полная ошибка:

Uncaught Error: define cannot be used indirect
    at module.exports (webpack:///(webpack)/buildin/amd-define.js?:2:8)
    at eval (main.js:1)
    at Object../app/js/app/main.js (main.js?bust=1558595950937:96)
    at __webpack_require__ (main.js?bust=1558595950937:20)
    at main.js?bust=1558595950937:84
    at main.js?bust=1558595950937:87
module.exports @ amd-define.js:2
(anonymous) @ main.js:1
./app/js/app/main.js @ main.js?bust=1558595950937:96
__webpack_require__ @ main.js?bust=1558595950937:20
(anonymous) @ main.js?bust=1558595950937:84
(anonymous) @ main.js?bust=1558595950937:87
angular.js:38 

Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.20/$injector/modulerr?p0=app&p1=Error%3A%20%5B%24injector%3Anomod%5D%20http%3A%2F%2Ferrors.angularjs.org%2F1.3.20%2F%24injector%2Fnomod%3Fp0%3Dapp%0A%20%20%20%20at%20http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A6%3A417%0A%20%20%20%20at%20http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A21%3A412%0A%20%20%20%20at%20a%20(http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A21%3A53)%0A%20%20%20%20at%20http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A21%3A296%0A%20%20%20%20at%20http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A35%3A46%0A%20%20%20%20at%20r%20(http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A7%3A322)%0A%20%20%20%20at%20g%20(http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A34%3A399)%0A%20%20%20%20at%20cb%20(http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A38%3A135)%0A%20%20%20%20at%20d%20(http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A17%3A381)%0A%20%20%20%20at%20tc%20(http%3A%2F%2Fgo.development%2Fbower_components%2Fangular%2Fangular.min.js%3Fbust%3D1558595950937%3A18%3A179)
    at angular.js:38
    at angular.js:4154
    at r (angular.js:326)
    at g (angular.js:4115)
    at cb (angular.js:4041)
    at d (angular.js:1455)
    at tc (angular.js:1476)
    at Jd (angular.js:1370)
    at HTMLDocument.<anonymous> (angular.js:26446)
    at j (jquery.js:3148)

1 Ответ

1 голос
/ 22 мая 2019

Похоже, у вас есть зависимости некоторых модулей, которые странным образом используют define (не используйте стандартный шаблон umd).

Вам нужно будет найти, какая из них связана с проблемой, а затем сделать что-то подобное в вашей конфигурации веб-пакета для этой библиотеки:

module: {
    noParse: /node_modules\/json-schema\/lib\/validate\.js/
}

Некоторые известные модули с этой проблемой: set-getter, jquery-migrate, Dexie

На странице веб-пакета github также открыто много проблем:
https://github.com/webpack/webpack/issues/138
https://github.com/webpack/webpack/issues/2958
https://github.com/doowb/set-getter/issues/1

...