2017-02-21 27 views
0

Я пытаюсь загрузить файл protobuf js, используя require, но я получаю следующее исключение на консоли.Uncaught Error: Имя модуля «aaa_bbb_1_pb» еще не загружено для контекста: _. Использовать require ([])

02-21 11:18:06.445 9130-9130/com.p.protoextensiontest I/chromium: [INFO:CONSOLE(5)] "Uncaught Error: Module name "js/proto/data_main_1_pb" has not been loaded yet for context: _. Use require([]) 
http://requirejs.org/docs/errors.html#notloaded", source: file:///android_asset/www/js/require.js (5) 
"Uncaught Error: Mismatched anonymous define() module: function p(){ 

Вот мой код index.js

var proto = require('js/proto/aaa_bbb_1_pb'); 

function onCreate(){ 
    console.log("in onCreate"); 
    parseProto(); 
} 
function parseProto(){ 
    var name = proto.person.personName; 
} 

Вот мой index.html

<head> 
    <title> Testing proto extension</title> 
    <script src="js/require.js"></script> 
    <script src="js/google-protobuf.js"></script> 
    <script src="js/index.js"></script> 

</head> 
<body> 
    <button type="button" onclick="onCreate()"> Create Data</button> <br/> 
</body> 

Я новичок на яваскрипт и Node.js. Пожалуйста, предоставьте любую ссылку.

ответ

1

Модуль, который вы показываете в index.js, находится в формате CommonJS. Он не имеет обертки и вызывает вызовы require, содержащие один строковый аргумент.

Однако, вы используете RequireJS для его загрузки. RequireJS является загрузчиком модуля AMD, а не загрузчиком модуля CommonJS. Вам не придется полностью переписывать свои require вызовов использовать формат AMD (а require вызова с массивом зависимостей и обратным вызовом), но вы должны по крайней мере обернуть код вашего модуля в define вызова, например:

define(function (require) { 
    var proto = require('js/proto/aaa_bbb_1_pb'); 

    function onCreate(){ 
     console.log("in onCreate"); 
     parseProto(); 
    } 

    function parseProto(){ 
     var name = proto.person.personName; 
    } 
} 

Отметьте, что onclick=onCreate() все еще не будет работать. Одна из целей использования модулей - избегать размещения всего в глобальном пространстве. Таким образом, onCreate недоступен onclick. Минимальный способ сделать его доступным - добавить window.onCreate = onCreate после определения функции, но я не рекомендую это делать. Вы должны либо добавить экспортированную функцию, которую вы можете вызвать при инициализации с помощью объекта кнопки, и вызовет addEventListener("click", onCreate), или модуль сможет выполнить поиск определенного элемента на странице (по идентификатору, имени класса и т. Д.) И вызвать addEventListener("click", onCreate).