听起来你几乎想创建一个可以在 NPM 上注册的 Angular 模块。
就您引用的错误而言,您可能需要调整“加载程序”脚本。我创建了一些使用这种格式的公共 npm 模块,也使用 webpack 来创建脚本。这就是我的“加载器”脚本的样子。它允许加载脚本标签、commonJS 和 AMD 模块。
import mooAccordionDirective from './mooAccordion.js';
import mooRepeatTranscludeModule from 'moo-utility-repeat-transclude';
(function (root, factory) {
if (typeof module !== 'undefined' && module.exports) {
// CommonJS
if (typeof angular === 'undefined') {
var angular = require('angular');
factory(angular);
module.exports = 'mooAngularAccordion';
} else {
factory(angular);
module.exports = 'mooAngularAccordion';
}
} else if (typeof define === 'function' && define.amd) {
// AMD
define(['angular'], factory);
} else {
// Global Variables
factory(root.angular);
}
}(this, function (angular) {
'use strict';
// create your angular module and do stuff
var moduleName = 'mooAngular.accordion';
var mod = angular.module(moduleName, ['mooAngular.utilityRepeatTransclude']);
mooAccordionDirective(mod);
return moduleName; // the name of your module
}));
有关我如何使用 Webpack+AngularJS+ES6 构建整个项目的更多参考,您可以查看 my github page for the moo-angular-accordion 项目。
如果你使用这个脚本,它看起来像:
(function (root, factory) {
if (typeof module !== 'undefined' && module.exports) {
// CommonJS also this prevents your error you are getting.
if (typeof angular === 'undefined') {
var angular = require('angular');
factory(angular);
module.exports = 'myModuleExportString';
} else {
factory(angular);
module.exports = 'myModuleExportString';
}
} else if (typeof define === 'function' && define.amd) {
// AMD
define(['angular'], factory);
} else {
// Global Variables
factory(root.angular);
}
}(this, function (angular) {
'use strict';
// create your angular module and do stuff
var moduleName = 'myModule';
var mod = angular.module(moduleName, ['otherDepModulesIfNeeded']);
mod.directive(/*... defined here ...*/);
return moduleName; // the name of your module
}));
细分:
- 您定义了一个 IIEF,它使用
this 调用,并且您的模块函数 (factory) 作为参数提供。
- 该逻辑检查
angular 是否已存在于全局命名空间中(以及是否支持 CommonJS。
- 如果
angular 存在,请使用它(这样它就不会被定义两次),并将 angular 传递给您的模块定义 (factory)
- 如果不是 CommonJS,请检查 AMD
- 如果不是 AMD,则作为全局加载到根目录(可用作脚本标签)
编辑:您也可以使用 Grunt、Gulp 或任何您想要捆绑资产的构建系统而不是 Webpack,但是上面的神奇脚本使您的模块可以以多种格式导出(AMD、Script Tag、CommonJS 等) .