ES6 中的全局导入

Global Import In ES6

我有一个大型第三方库需要在两个项目之间共享。该项目有多个文件夹,其中包含多个包含多个导出的文件。而不是像这样导入这些模块

import {BaseContainer} from '@company/customproject/src/containers/BaseContainer.js'

我愿意这样做

import { BaseContainer } from '@company/customproject'

我知道我可以手动将所有模块导入基本目录中的单个 index.js 文件,但我想知道是否有更简单的方法不用显式导入它们

I know I can manually import all the modules into a single index.js file in the base directory but i am wondering if there is an easier way to do not have import them all explicitly

您实际上应该只创建一个 index.js 文件并将要导出的任何内容导入到该文件中,这样您就可以控制导出哪些 API 并且不导出私有 API。

也就是说有一个 automated tool 会自动为您生成一个 index.js:

> npm install -g create-index
> create-index ./src

这将生成包含所有导出的 index.js

正如其他答案所建议的那样,您应该在每个目录中创建一个 index.js 并明确导出内容

@company/customproject/index.js

import {BaseContainer, SomeOtherContainer} from './src/containers'

export {
  BaseContainer,
  SomeOtherContainer
}

@company/customproject/src/containers/index.js

import BaseContainer from './BaseContainer'
import SomeOtherContainer from './SomeOtherContainer'

export {
  BaseContainer,
  SomeOtherContainer
}

另一个自动加载整个目录的选项是使用 requiremodule.exports 来导出每个扫描的文件。使用 ES6 import/export 以及 module.exports 和默认导出语句可能 运行 会发生冲突。

@company/customproject/index.js

const fs = require('fs')
const modules = {}

fs.readdirSync(__dirname+'/src/containers').forEach(file => {
  file = file.replace('.js', '')
  modules[file] = require('./src/containers/'+file)
  // map default export statement
  if (modules[file].default) {
    modules[file] = modules[file].default
  }
})

module.exports = modules

然后只需在任何 ES5 或 ES6 模块中使用它

const {BaseContainer} = require('@company/customproject')

import {BaseContainer} from '@company/customproject'