mozilla

Compare Revisions

Chrome Worker Modules

Change Revisions

Revision 441333:

Revision 441333 by Yoric on

Revision 441335:

Revision 441335 by Yoric on

Title:
Chrome Worker Modules
Chrome Worker Modules
Slug:
Mozilla/ChromeWorkers/Chrome_Worker_Modules
Mozilla/ChromeWorkers/Chrome_Worker_Modules
Content:

Revision 441333
Revision 441335
n8      The preferred way to define and load modules for Chrome Worn8      The preferred way to define and load modules for Chrome Wor
>kers is to use the Chrome Worker Module Loader. This module loade>kers is to use the Chrome Worker Module Loader. This module loade
>r should not surprise developers familiar with CommonJS, as it im>r should not surprise developers familiar with CommonJS, as it im
>plements a minimal CommonJS <tt>require()</tt>.>plements a minimal CommonJS <code><code>require()</code></code>.
n10    <h2 style="text-align:justify;">n10    <h2 id="Loading_modules" style="text-align:justify;">
n20    <div class="container">n20    <pre class="brush: js" style="text-align: justify;">
21      <pre class="line number3 index2 alt2">21// Import the module loader.
22<code class="brush: js">// Import the module loader.</code>
23<code class="jscript comments">// You only need to do this once p22// You only need to do this once per worker, but doing it several
>er worker, but doing it several times is ok.</code>> times is ok.
24<code class="jscript plain">importScripts(</code><code class="jsc23importScripts("resource://gre/modules/workers/require.js");
>ript string">"<a>resource://gre/modules/workers/require.js</a>"</ 
>code><code class="jscript plain">);</code> 
n26    </div>n
27    <div>
28      &nbsp;
29    </div>
n31      This defines a global value <tt>require()</tt>, that you man26      This defines a global value <code>require()</code>, that yo
>y now use as follows:>u may now use as follows:
n36    <div class="container">n31    <pre class="brush: js">
37      <pre class="line number6 index5 alt1">32// Import the module
38<code class="brush: js">// Import the module</code>33// (here, we import the core of OS.File)
39<code class="jscript comments">// (here, we import the core of OS34let Core = require("resource://gre/modules/osfile/osfile_shared_a
>.File)</code>>llthreads.jsm");
40<code class="jscript plain">let Core = require(</code><code class
>="jscript string">"<a>resource://gre/modules/osfile/osfile_shared 
>_allthreads.jsm</a>"</code><code class="jscript plain">);</code> 
n42<code class="jscript comments">// We may now use module osfile_shn36// We may now use module Core.
>ared_allthreads. Since it exports a value |declareFFI|, let's try 
> it:</code> 
43<code class="jscript plain">Core.declareFFI(...)</code>37Core.declareFFI(...)
n45    </div>n
n47      Note that, for the moment, <tt>require()</tt> only accepts n40      Note that, for the moment, <code>require()</code> only acce
>absolute URIs. If the your module URI ends with “.js”, you can om>pts absolute URIs. If the your module URI ends with “.js”, you ca
>it the extension.>n omit the extension.
n49    <h2 style="text-align:justify;">n42    <h2 id="Creating_modules" style="text-align:justify;">
n56      A module is a file, whose filename generally ends with eithn49      A module is a file, whose filename generally ends with eith
>er “.js” or “.jsm”, and designed to be opened through <tt>require>er “.js” or “.jsm”, and designed to be opened through <code>requi
>()</tt>. Any value you define in that file is private by default.>re()</code>. Any value you define in that file is private by defa
> To make the value public, you just have to add it to either glob>ult. To make the value public, you just have to add it to either 
>al value <tt>exports</tt>, as follows:>global value <code>exports</code>, as follows:
n58    <div>n51    <pre class="brush: js" style="text-align: justify;">
59      <div class="container">52/* File myModule.js */
60        <pre class="line number6 index5 alt1">53let secretKey = "this is a secret";
61<code class="brush: js">/* File myModule.js */</code>54let publicKey = "this is public";
62<code class="jscript spaces"> </code><code class="jscript plain">55exports.key = publicKey;
>let secretKey = </code><code class="jscript string">"this is a se 
>cret"</code><code class="jscript plain">;</code> 
63<code class="jscript spaces"> </code><code class="jscript plain">56// secretKey is not exported
>let publicKey = </code><code class="jscript string">"this is publ 
>ic"</code><code class="jscript plain">;</code> 
64 57// publicKey is exported with name "key"
65<code class="jscript spaces"> </code><code class="jscript plain">
>exports.key = publicKey;</code> 
66<code class="jscript spaces"> </code><code class="jscript comment
>s">// secretKey is not exported</code> 
67<code class="jscript spaces"> </code><code class="jscript comment
>s">// publicKey is exported with name "key"</code> 
n69      </div>n
70    </div>
n75      <div class="container">n63      <pre class="brush: js">
76        <pre class="line number4 index3 alt1">
77<code class="brush: js">// variable |module| is a special global 64// variable |module| is a special global introduced by require()
>introduced by require()</code> 
78 65module.exports = {
79<code class="jscript plain">module.exports = {</code> 66  key: publicKey
80<code class="jscript plain">  key: publicKey</code>67};
81<code class="jscript plain">};</code>
n83      </div>n
n89      <div class="container">n74      <pre class="brush: js">
90        <pre class="line number5 index4 alt2">
91<code class="brush: js">// Assuming that myModule.js is installed75// Assuming that myModule.js is installed to resource://gre/modul
> to <a>resource://gre/modules/myModule.js</a></code>>es/myModule.js
92<code class="jscript plain">let Module = require(</code><code cla76let Module = require("resource://gre/modules/myModule.js")
>ss="jscript string">"<a>resource://gre/modules/myModule.js</a>"</ 
>code><code class="jscript plain">)</code> 
n94<code class="jscript plain">foo(Module.key); </code><code class="n78foo(Module.key); // Module.key == "this is public";
>jscript comments">// Module.key == "this is public";</code> 
95<code class="jscript comments">// However, secretKey is not expor79// However, secretKey is not exported and cannot be used
>ted and cannot be used</code> 
n97      </div>n
n99    <h2 style="text-align:justify;">n82    <p style="text-align: justify;">
83      For the installation of resources, please see the documenta
 >tion on moz.build (if your code is part of the platform) or on ch
 >rome manifests (if your code is part of an add-on).
84    </p>
85    <h2 id="Stack_traces" style="text-align:justify;">
nn91    <pre class="brush: js">
92try {
93    MyModule.foo();
94} catch (ex) {
95    log("Exception raised at " + ex.fileName)
96    log("Stack: " + ex.stack);
97}
98</pre>
99    <p style="text-align:justify;">
100      Rather, you should use properties <code>moduleName</code> a
 >nd <code>moduleStack</code>, as follows:
101    </p>
n106      &nbsp;n103      <pre class="brush: js">
107    </div>104try {
108    <div class="container">105    MyModule.foo();
109      <pre class="line number6 index5 alt1">106} catch (ex) {
110<code class="brush: js">try</code> <code class="jscript plain">{<107    log("Exception raised at " + ex.moduleName)
>/code> 
111<code class="jscript plain">  MyModule.foo();</code>108    log("Stack: " + ex.moduleStack);
112<code class="jscript plain">} </code><code class="jscript keyword109}
>">catch</code> <code class="jscript plain">(ex) {</code> 
113<code class="jscript plain">  log(</code><code class="jscript str
>ing">"Exception raised at "</code> <code class="jscript plain">+  
>ex.fileName)</code>; 
114<code class="jscript plain">  log(</code><code class="jscript str
>ing">"Stack: "</code> <code class="jscript plain">+ ex.stack);</c 
>ode> 
115<code class="jscript plain">}</code>
n118    <p style="text-align:justify;">n
119      Rather, you should use properties <tt>moduleName</tt> and <
>tt>moduleStack</tt>, as follows: 
120    </p>
121    <div>
122      <div class="container">
123        <pre class="line number6 index5 alt1">
124<code class="brush: js">try</code> <code class="jscript plain">{<
>/code> 
125<code class="jscript spaces">  </code><code class="jscript plain"
>>MyModule.foo();</code> 
126<code class="jscript plain">} </code><code class="jscript keyword
>">catch</code> <code class="jscript plain">(ex) {</code> 
127<code class="jscript spaces">  </code><code class="jscript plain"
>>log(</code><code class="jscript string">"Exception raised at "</ 
>code> <code class="jscript plain">+ ex.moduleName)</code> 
128<code class="jscript spaces">  </code><code class="jscript plain"
>>log(</code><code class="jscript string">"Stack: "</code> <code c 
>lass="jscript plain">+ ex.moduleStack);</code> 
129<code class="jscript plain">}</code>
130</pre>
131      </div>
132    </div>
133    <h2 style="text-align:justify;">112    <h2 id="Subtleties" style="text-align:justify;">
n137      You shouldn’t mix both styles <tt>exports.foo = bar</tt> ann116      You shouldn’t mix both styles <code>exports.foo = bar</code
>d <tt>module.exports = {foo: bar}</tt>. If you do, know that any >> and <code>module.exports = {foo: bar}</code>. If you do, know t
>call to <tt>module.exports</tt> will overwrite all calls to `expo>hat any call to <code>module.exports</code> will overwrite all ca
>rts.foo = bar.>lls to `exports.foo = bar.
n140      You should not modify <tt>exports</tt> or <tt>module.exportn119      You should not modify <code>exports</code> or <code>module.
>s</tt> once your module initialization is complete.>exports</code> once your module initialization is complete.
n143      The module loader supports cyclic calls to <tt>require()</tn122      The module loader supports cyclic calls to <code>require()<
>t>. However, if you have cyclic requirements, some of the modules>/code>. However, if you have cyclic requirements, some of the mod
> involved in the cyclic requirements may become visible by the ot>ules involved in the cyclic requirements may become visible by th
>her modules before they are fully evaluated.>e other modules before they are fully evaluated.
t146      No attempt is made to fully isolate modules from each othert125      No attempt is made to fully isolate modules from each other
>. In particular, globals (<tt>String</tt>, <tt>Math</tt>, <tt>Obj>. In particular, globals (<code>String</code>, <code>Math</code>,
>ect</tt>, <tt>self</tt>) and the worker global scope itself (<tt>> <code>Object</code>, <code>self</code>) and the worker global sc
>this</tt>) are shared between workers. In other words, the true i>ope itself (<code>this</code>) are shared between workers. In oth
>solation unit is the worker itself, not the module.>er words, the true isolation unit is the worker itself, not the m
 >odule.

Back to History