`
Irving_wei
  • 浏览: 132593 次
  • 性别: Icon_minigender_1
  • 来自: Heaven
社区版块
存档分类
最新评论

代码共享 -- Javascript code modules

 
阅读更多

一个Javascript code module是被放置在经过注册位置的简单js代码。 通过Components.utils.import() or Components.utils["import"]()方法来实现module的引用。

 

它允许在插件内部,将其它域的js对象放置在当前对象的域中使用。

看一个例子:

const EXPORTED_SYMBOLS = ['sayHello'];

 

function sayHello(){

return ‘Hello World’;

}

 

 

除了有一个固定的const EXPORTED_SYMBOLS 数组之外,和普通的js文件没什么区别。

第一句表示:将sayHello变量export到引用它的对象的域中。

可以来验证一下:

①、将HelloWorld插件做一些修改:

增加了一个core.js,增加了一个codeModules.js内容分别如下:

Components.utils.import('resource://module/codeModules.js');

window.addEventListener('load'function() {

gBrowser.addEventListener('DOMContentLoaded'function(e) {

 alert(sayHello());

}, false);

}, false);

 

const EXPORTED_SYMBOLS = ['sayHello'];

 

function sayHello(){

return 'hello world';

}

 

②、因为我们已经将content注册过了,所以接下来注册modules,修改chrome.manifest

resource         module       chrome/modules/ 

 

③、将core.js引入到页面,修改

<script type="application/javascript" src="chrome://sample/content/core.js"></script>

 

这样一来,打开任意一个页面,都会调用core.js里面的方法。

接下来看看core.js文件,一开始就通过:Components.utils.import('resource://module/codeModules.js');

引入了一个插件内的文件,然后就可以在core.js里面调用这个文件的方法了,当然前提是这个文件已经将这个方法给export了,如果要export多个方法,可以修改EXPORTED_SYMBOLS数组,添加一个新的变量即可。

运行结果,打开任意的页面,可以弹出:

 

这样就可以引申出一个设计架构,在插件开发的时候,个人觉得还是比较实用的:

可以设计一个类似于如下的Module,命名为util.js

const EXPORTED_SYMBOLS = ['Util'];

 

var Util = {

  __noSuchMethod__ : function(aName, aArguments) {

    try {

      Components.utils.import('resource://module/utils/' + aName + '.js',

      Util);

      return Util[aName].apply(Util, aArguments);

    } catch (e) {

      throw new Error('Could not import util ' + aName + ':\n' + e);

    }

  }

}

 

这个Module有一个Util对象,它覆盖了 __noSuchMethod__这个方法,这个方法是FF暴露出来的接口,如何在某个对象上调用一个不存在的方法,在FF浏览器中,就会执行__noSuchMethod__方法,如果这个对象覆盖了这个方法,那么就会按照覆盖的方法执行。这样一来就可以把这个对象当做工具来使用了,如果调用它不存在的方法,它就会去引入以这个方法名为名字的资源文件,然后通过apply调用这个方法。

__noSuchMethod__的详细介绍,请参考:http://irving-wei.iteye.com/blog/1994948

 

 

如何使用这个Module

 

module目录下创建一个新的目录,命名为utils,将codeModules.js拖入其中,改名为sayHello.js。新的目录结构如下图:

 

接下来就可以修改core.js

Components.utils.import('resource://module/util.js');

window.addEventListener('load'function() {

gBrowser.addEventListener('DOMContentLoaded'function(e) {

 alert(Util.sayHello());

}, false);

}, false);

 

Build,安装插件,运行。

 

只要在util目录下添加以需要暴露的方法命名的a.js文件,就可以通过Util工具类在任意引入util.js的文件中调用a方法了,非常方便。

这个设计来源自GraseMonkey的源码分析。

<!--EndFragment-->
  • 大小: 12.4 KB
  • 大小: 13.8 KB
  • 大小: 11.8 KB
分享到:
评论

相关推荐

    TutsPlus-Object-Oriented-JavaScript-with-ES2015:TutsPlus课程的源代码-java source code

    这个"TutsPlus-Object-Oriented-JavaScript-with-ES2015"课程的源代码着重讲解了如何在JavaScript中使用ES2015的新特性来实现面向对象编程。 ES2015,也被称为ES6,是ECMAScript的一个重要版本,引入了许多新特性,...

    [ng-book.2r60随书代码]ng-book.2.Angular.4.r60.2017.4.code-samples.zip

    这个压缩包“ng-book.2.Angular.4.r60.2017.4.code-samples.zip”就是该书配套的代码资源,它涵盖了多个关键知识点,旨在通过实践来巩固理论学习。 1. **Angular 4基础**:Angular 4是Google维护的一个开源...

    AngularJS UI Development 随书代码

    《AngularJS UI Development》这本书是关于使用AngularJS框架进行用户界面开发的专业指南,随书附带的代码资源库名为"AngularUI-Code-master"。这个压缩包中的代码旨在帮助读者深入理解并实践AngularJS在构建现代Web...

    test-code-build

    - **代码审查**:团队成员互相审查代码,提高代码质量并促进知识共享。 3. **构建工具**: - **Webpack**:一个模块打包工具,可以将JavaScript、CSS、图片等各种资源打包成优化过的静态资源。 - **Gulp** 和 **...

    ng-book2: The Complete Book on Angular5.r66随书源代码

    这个压缩包"ng-book-code"包含的源代码,很可能是按照书中章节结构组织的,便于读者对照学习。通过这些源代码,你可以了解: 1. **模块化(Modules)**:Angular5引入了 NgModule,它是应用的基本构建块,用于组织...

    re-code-splitting

    **代码分割(Re-Code Splitting)** 在现代Web开发中,优化应用程序性能是至关重要的。其中,代码分割是一种有效的技术,它允许我们按需加载应用程序的不同部分,从而减少初始加载时间并改善用户体验。在JavaScript中...

    JavaScript_很棒的React Native组件新闻工具和学习材料.zip

    React Native则在此基础上增加了对原生平台的访问,比如通过`Native Modules`和`Native Components`与Java或Swift代码交互。 在开发过程中,熟悉常用的开发工具如Visual Studio Code、ESLint、Prettier和Flow也很...

    采用ReactNative开发的一个Wunderlist克隆

    开发者可能使用Visual Studio Code、Atom或WebStorm等集成开发环境,配合ESLint和Prettier进行代码格式化和检查。测试过程中,使用模拟器或真实设备进行调试,以及Expo或Xcode、Android Studio进行打包和发布。 7....

    ng-book2-r42

    【ng-book2-r42】是一个关于Angular框架的深度学习...如果你已经拥有《ng-book》r41的PDF,并且对r42的更新不感兴趣,那么主要关注"ng-book-code"中的代码示例,结合书中的解释,将是一个非常有价值的自我学习资源。

    webpack.rar

    6. **代码分割(Code Splitting)**: 为了提高应用的加载速度,Webpack 提供了代码分割功能,可以将不立即需要的代码分离到单独的包中,延迟加载,实现按需加载。 7. **Tree Shaking**:从Webpack 2.0开始引入,Tree ...

    TypeScript编程语言 v4.1.3-源码.zip

    5. **模块(Modules)**:TypeScript支持ES6的模块系统,允许我们将代码组织成独立的模块,这样可以更好地管理和共享代码,同时避免命名冲突问题。 6. **装饰器(Decorators)**:装饰器是一种特殊类型的声明,可以...

    angular-gem-store:代码学校角度教程的代码游乐场

    3. `bower_components` 或 `node_modules`:这些目录可能包含 AngularJS 和其他依赖库的源码。 4. `.bowerrc` 和 `bower.json`:这些文件用于管理 Bower 包依赖。 5. `scripts` 或 `js` 目录:可能包含自定义的 ...

    hexo.blog.code.io:博客源代码

    "系统开源"的标签进一步强调了这个项目是开放源代码的,遵循开源社区的共享和协作原则。这意味着任何人都可以查看、使用、修改以及分享这些代码,这为开发者提供了极大的灵活性和透明度。 在压缩包文件"hexo.blog....

    ASP.NET配合jQuery解决跨域调用的问题.txt

    对于跨域问题,可以通过多种方式来解决,如JSONP、CORS(跨源资源共享)等。其中,利用ASP.NET配合jQuery是一种常见且实用的方法。本文将详细介绍如何在ASP.NET项目中配置CORS,并结合jQuery实现跨域请求。 #### ...

    DMS-Codia

    在JavaScript中,可以使用Monaco Editor(Visual Studio Code的底层编辑器)或者ace-editor等开源组件来构建这样的功能,提供代码高亮、自动完成和错误检查等功能。 文件名为“DMS-Codia-main”的压缩包可能包含了...

    cj-username-search:一个糟糕的脚本,以在codejam记分板上获得您最喜欢的用户的排名,因为codejam的新用户界面不允许

    【cj-username-search】是一个基于JavaScript编写的脚本,旨在帮助用户在Google Code Jam (GCJ) 的新用户界面下获取他们关注的参赛者的排名。由于GCJ的新界面取消了某些功能,使得直接查看特定用户的排名变得不便,...

    vuex模块化demo

    - `jsconfig.json`:VS Code 的 JavaScript 项目配置文件,用于代码智能提示和导航。 - `yarn.lock`:Yarn 包管理器的锁定文件,确保每次安装相同版本的依赖。 - `README.md`:项目说明文档。 - `src`:源代码目录,...

    前端项目-angular-vertxbus.zip

    通常,一个AngularJS项目会包括“app”目录(存放应用代码)、“bower_components”或“node_modules”(第三方库)、“index.html”(主入口文件)、“scripts”(JavaScript脚本)和“styles”(CSS样式)等子目录...

    b3dm翻译和跨域问题

    在IT行业中,Cesium是一个广泛使用的开源JavaScript库,主要用于创建高度交互的3D地球和地理空间应用程序。"b3dm翻译和跨域问题"这个主题涉及到两个关键的技术点:b3dm格式的数据处理以及Web应用中的跨域资源共享...

Global site tag (gtag.js) - Google Analytics