UMD на сайтах, использующих RequireJS, не работает? - PullRequest
0 голосов
/ 31 мая 2019

Когда я захожу на подавляющее большинство веб-сайтов, открываю консоль и вставляю следующий код:

(function(global, appName, app) {
    if (typeof define === "function" && typeof define.amd === "object") {
        console.log("AMD/RequireJS");
        define(app);
        console.log("defined app");
    } else if (typeof module !== "undefined") {
        console.log("CommonJS");
        module.exports = app(global);
        console.log("defined with module.exports");
    } else {
        console.log("Browser");
        global[appName] = app(global);
        console.log("defined as global");
    }
})(this, "App", function(global) {
    "use strict";
    console.log("defining getThis");
    function getThis() {
        console.log('i got it!');
    }
    return {
        getThis: getThis
    };
});
console.log("finished IIFE");
App.getThis();

Я получаю следующий вывод:

Browser
defining getThis
defined as global
finished IIFE
i got it!

Если я вставлю этот же код в консоль сайта, который использует RequireJS, например www.bestbuy.com или www.homedepot.com, произойдет сбой с таким выводом:

AMD/RequireJS
defined app
finished IIFE
Uncaught ReferenceError: App is not defined at <anonymous>:27:1

Я пытался изменить строку define(app); на define(['App'], app); безрезультатно.

Я уже много часов гуглю и тусуюсь с этим, и я нахожусь в конце. Я думал, что модель UMD была УНИВЕРСАЛЬНОЙ, отсюда и ее название. Что дает?

1 Ответ

0 голосов
/ 04 июня 2019

Ну, все зависит от того, как вы собираетесь использовать свой скрипт.Если вы знаете, что собираетесь использовать свой скрипт в браузере без RequireJS, тогда все в порядке, как вы его тестируете.

App.getThis();

Поскольку в глобальном объекте, в случаебраузер, window.

Но если вы знаете, что RequireJS присутствует, то вам нужно require ваше приложение.

require(["App"], function(App){
    App.getThis();
});

И если NodeJS

const App = require('App');

Но я не проверял этот.

Кроме того, я рекомендую вам изменить define(app); на define(appName, app);

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...