javascript - 将 angularjs 模块导出为 es6 模块

标签 javascript angularjs babeljs es6-module-loader

您应该根据我们使用的样式指南将 angularjs 模块包装在 IIFE 中

https://github.com/johnpapa/angular-styleguide/tree/master/a1#iife

我的目录.js

(function() {
    'use strict';

    angular
        .module('my.dir', [])
        .controller('MyDirController', MyDirController),
        .directive('my-dir', MyDirDirective);

    function MyDirController() {

    }

    function MyDirDirective() {
        return {
            restrict: 'E',
            controller: MyDirController
        }
    }
})();

应用程序.js

(function() {
    'use strict';
    angular
        .module('app', ['my.dir'])
})();

但是因为我们现在使用 webpack 来打包 es6 模块。我们应该如何使用这个 IIFE 和 export?我们不能执行 export default angular.module('my-dir', []) 因为 export 必须是顶级命令。另外,我们应该只返回模块名称的字符串吗?这样它就可以作为一个要求包含在 app 模块中。什么是最佳实践?

这行得通,但是你必须重新输入模块名称,并且在 IIFE 之外导出似乎有点困惑(我认为必须如此)

(function() {
    angular.module('my.dir', [])
        .controller('MyDirController', MyDirController)
        .directive('my-dir', MyDirDirective);

    function MyDirDirective(appPath) {
        return {
            restrict: 'E',
            scope: {},
            bindToController: {},
            controllerAs: '$ctrl',
            template: '<div ng-bind="$ctrl.msg"></div>',
            controller: MyDirController
        };
    }

    function MyDirController() {
        var self = this;
        self.msg = "Hello World";
    }
})();
export default 'my.dir'

最佳答案

移动到模块后,新的结构变成了

应用程序.js

import myDir from './my-dir.js'

angular.module('app', [myDir.name]);

我的目录.js

// import template from './my-dir.html'; // Can use this with template property

export default angular.module('my.dir', [])
    .controller('MyDirController', MyDirController)
    .directive('my-dir', MyDirDirective);

function MyDirDirective() {
    return {
        restrict: 'E',
        scope: true,
        bindToController: {},
        controllerAs: '$ctrl',
        template: '<div ng-bind="$ctrl.msg"></div>',
        controller: MyDirController
    };
}

function MyDirController() {
    const self = this;  // Not needed if using arrow functions
    self.msg = "Hello World";
}

不再需要 IIFE,因为如果总是使用任何类型的 javascript 模块系统,现在默认情况下一切都是模块

关于javascript - 将 angularjs 模块导出为 es6 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767391/

相关文章:

angularjs - AngularJS 的异步请求和加载按钮

javascript - Angular multipart/form-data 表单发送

reactjs - 让 Nextjs 忽略 babel.config.js

javascript - jQuery - 用于切换内容的自定义插件

javascript - 我有一个空函数,用于在 Angularjs 中注销我的 Controller

angularjs - 带有 express 的 Angular HTML5 模式

vue.js - 使用 vue-cli 找不到模块 './src/data'

javascript - 为什么我的 ES6(使用 Babel)类说 `this` 在实例方法中未定义?

javascript - GTM dataLayer .push 创建一个新对象,而不是将其添加到现有 dataLayer

javascript - react 渲染插入相邻元素