一个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-->
相关推荐
这个"TutsPlus-Object-Oriented-JavaScript-with-ES2015"课程的源代码着重讲解了如何在JavaScript中使用ES2015的新特性来实现面向对象编程。 ES2015,也被称为ES6,是ECMAScript的一个重要版本,引入了许多新特性,...
这个压缩包“ng-book.2.Angular.4.r60.2017.4.code-samples.zip”就是该书配套的代码资源,它涵盖了多个关键知识点,旨在通过实践来巩固理论学习。 1. **Angular 4基础**:Angular 4是Google维护的一个开源...
《AngularJS UI Development》这本书是关于使用AngularJS框架进行用户界面开发的专业指南,随书附带的代码资源库名为"AngularUI-Code-master"。这个压缩包中的代码旨在帮助读者深入理解并实践AngularJS在构建现代Web...
- **代码审查**:团队成员互相审查代码,提高代码质量并促进知识共享。 3. **构建工具**: - **Webpack**:一个模块打包工具,可以将JavaScript、CSS、图片等各种资源打包成优化过的静态资源。 - **Gulp** 和 **...
这个压缩包"ng-book-code"包含的源代码,很可能是按照书中章节结构组织的,便于读者对照学习。通过这些源代码,你可以了解: 1. **模块化(Modules)**:Angular5引入了 NgModule,它是应用的基本构建块,用于组织...
**代码分割(Re-Code Splitting)** 在现代Web开发中,优化应用程序性能是至关重要的。其中,代码分割是一种有效的技术,它允许我们按需加载应用程序的不同部分,从而减少初始加载时间并改善用户体验。在JavaScript中...
React Native则在此基础上增加了对原生平台的访问,比如通过`Native Modules`和`Native Components`与Java或Swift代码交互。 在开发过程中,熟悉常用的开发工具如Visual Studio Code、ESLint、Prettier和Flow也很...
开发者可能使用Visual Studio Code、Atom或WebStorm等集成开发环境,配合ESLint和Prettier进行代码格式化和检查。测试过程中,使用模拟器或真实设备进行调试,以及Expo或Xcode、Android Studio进行打包和发布。 7....
【ng-book2-r42】是一个关于Angular框架的深度学习...如果你已经拥有《ng-book》r41的PDF,并且对r42的更新不感兴趣,那么主要关注"ng-book-code"中的代码示例,结合书中的解释,将是一个非常有价值的自我学习资源。
6. **代码分割(Code Splitting)**: 为了提高应用的加载速度,Webpack 提供了代码分割功能,可以将不立即需要的代码分离到单独的包中,延迟加载,实现按需加载。 7. **Tree Shaking**:从Webpack 2.0开始引入,Tree ...
5. **模块(Modules)**:TypeScript支持ES6的模块系统,允许我们将代码组织成独立的模块,这样可以更好地管理和共享代码,同时避免命名冲突问题。 6. **装饰器(Decorators)**:装饰器是一种特殊类型的声明,可以...
3. `bower_components` 或 `node_modules`:这些目录可能包含 AngularJS 和其他依赖库的源码。 4. `.bowerrc` 和 `bower.json`:这些文件用于管理 Bower 包依赖。 5. `scripts` 或 `js` 目录:可能包含自定义的 ...
"系统开源"的标签进一步强调了这个项目是开放源代码的,遵循开源社区的共享和协作原则。这意味着任何人都可以查看、使用、修改以及分享这些代码,这为开发者提供了极大的灵活性和透明度。 在压缩包文件"hexo.blog....
对于跨域问题,可以通过多种方式来解决,如JSONP、CORS(跨源资源共享)等。其中,利用ASP.NET配合jQuery是一种常见且实用的方法。本文将详细介绍如何在ASP.NET项目中配置CORS,并结合jQuery实现跨域请求。 #### ...
在JavaScript中,可以使用Monaco Editor(Visual Studio Code的底层编辑器)或者ace-editor等开源组件来构建这样的功能,提供代码高亮、自动完成和错误检查等功能。 文件名为“DMS-Codia-main”的压缩包可能包含了...
【cj-username-search】是一个基于JavaScript编写的脚本,旨在帮助用户在Google Code Jam (GCJ) 的新用户界面下获取他们关注的参赛者的排名。由于GCJ的新界面取消了某些功能,使得直接查看特定用户的排名变得不便,...
- `jsconfig.json`:VS Code 的 JavaScript 项目配置文件,用于代码智能提示和导航。 - `yarn.lock`:Yarn 包管理器的锁定文件,确保每次安装相同版本的依赖。 - `README.md`:项目说明文档。 - `src`:源代码目录,...
通常,一个AngularJS项目会包括“app”目录(存放应用代码)、“bower_components”或“node_modules”(第三方库)、“index.html”(主入口文件)、“scripts”(JavaScript脚本)和“styles”(CSS样式)等子目录...
在IT行业中,Cesium是一个广泛使用的开源JavaScript库,主要用于创建高度交互的3D地球和地理空间应用程序。"b3dm翻译和跨域问题"这个主题涉及到两个关键的技术点:b3dm格式的数据处理以及Web应用中的跨域资源共享...