新的javascript ES6模块术语中的合格和不合格导入有什么区别?

时间:2016-01-22 18:28:02

标签: javascript ecmascript-6 es6-module-loader

我遇到了这种区别,ExploringJS

中没有解释清楚
  

合格和不合格的进口工作方式相同(它们都是间接的)

区别是什么,因此该陈述的含义是什么?

1 个答案:

答案 0 :(得分:1)

严格来说,JavaScrpit中没有合格/不合格的导入。这些术语在“探索ES6”一书中使用。由Axel Rauschmayer博士在循环依赖的背景下,大致意思是:

不合格的导入(直接导入模块的一部分):

CommonJS的

angular
    .module('App', ['ui.router'])
    .config(function($stateProvider, $urlRouterProvider){
        $urlRouterProvider.otherwise('/');
        $stateProvider
            .state('home', {
                url: '/',
                template: '<h1>Home</h1>',
                controller: function(){
                    this.goDashboard = function() {
                        $state.go('status.service.dashboard');
                    };
                    this.goComponent = function() {
                        $state.go('status.service.component');
                    };
                }
            })
            .state('status', {
                template: '<h1>Status</h1><div ui-view></div>',
                url: '/status',
                resolve: {
                    service:  function($http, $state){
                        return $http.get('/service.json')
                            .then (function (response) {
                                return response.data.id;
                            });
                    }
                }
            })
            .state('status.service', {
                url: '/service/:serviceId',
                abstract: true,
                resolve: {
                    setId: function(service,$stateParams){
                        $stateParams.serviceId = service;
                    }
                },
                params: {
                    serviceId: null
                }
            })
            .state('status.service.dashboard', {
                template: '<h1>Dashboard</h1>',
                url: '/dashboard'
            })
            .state('status.service.component', {
                template: '<h1>Component</h1>',
                url: '/component',
                controllerAs: '$ctrl'
            });
    })

ES2015

var foo = require('a').foo // doesn't work with cyclic dependencies

合格导入(将整个模块作为命名空间导入):

CommonJS的

import {foo} from 'a' // can work with cyclic dependencies*

ES2015

var a = require('a')
function bar() {
  a.foo() // can work with cyclic dependencies*
}
exports.bar = bar

在ES2015中,默认导入也可以是合格的导入(尽管有些人不同意),如果它们充当命名空间:

import * as a from 'a'
export function bar() {
  a.foo() // can work with cyclic dependencies*
}

*具有循环依赖关系,您无法访问模块正文中的导入:

export default {
  fn1,
  fn2
}