是的,这是可能的。通过对 web worker 环境的一些修改,您可以在 web worker 中运行 Angular,并拥有一个在前台和 worker Angular 应用程序中都使用的模块。这个答案接受并扩展来自another of my answers regarding unit testing的代码
在主应用程序中,在工厂/服务中,您可以拥有类似的东西
var worker = new $window.Worker('worker.js');
然后在worker.js 中,您可以修改全局范围以使Angular 加载:
// Angular needs a global window object
self.window = self;
// Skeleton properties to get Angular to load and bootstrap.
self.history = {};
self.document = {
readyState: 'complete',
querySelector: function() {},
createElement: function() {
return {
pathname: '',
setAttribute: function() {}
}
}
};
// Load Angular: must be on same domain as this script
self.importScripts('angular.js');
// Put angular on global scope
self.angular = window.angular;
// Standard angular module definitions
self.importScripts('worker-app.js');
self.importScripts('shared-module.js');
// No root element seems to work fine
self.angular.bootstrap(null, ['worker-app']);
您可以像定义其他任何东西一样定义shared-module:
angular.module('shared-module', [])
.factory('SharedFactory', function() {
return {
myFunc: function() {
return 'some-data';
}
};
});
在worker-app.js,你可以定义主应用,使用共享模块
var workerApp = angular.module('worker-app', ['shared-module']);
将共享组件注入到工作应用程序的run 回调中。
workerApp.run(function(SharedFactory, $window) {
$window.onmessage = function(e) {
var workerResult = SharedFactory.myFunc();
$window.postMessage(workerResult);
};
});
在前台 Angular 应用程序中,您可以通过通常的脚本标签包含 shared-module.js,并像往常一样使用依赖注入来访问其组件
var foregroundApp = angular.module('forground-app', ['shared-module']);
foregroundApp.controller(function(SharedFactory, $scope) {
// Use SharedFactory as needed
});
为了确认,shared-module 在前台和工作应用程序中的实例是不同的。