2017-02-21 74 views
0

我想加載protobuf js文件使用require,但我在控制檯上遇到以下異常。未捕獲錯誤:模塊名稱「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> 

我是新手在JavaScript和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),或者模塊可以搜索頁面上的特定元素(按ID,類名稱,等等)並調用addEventListener("click", onCreate)

相關問題