在es6中有条件地导入peerDependency

时间:2018-02-06 10:29:25

标签: javascript import babeljs es6-modules peer-dependencies

我正在开发一个JavaScript i18n库,用于本地化日期(以及其他类型和对象)。

它目前依赖于moment.js,它被定义为peerDependency(本地化是其中一项功能,但不是唯一的功能,可能不会使用)

// package.json
{
  "name": "my-i18n-library",
  // ...
  "scripts": {
    // ...
    "clean": "rimraf build",
    "build": "babel src -d build",
    "prepare": "npm run clean && npm run build"
  },
  "peerDependency": {
      "moment": "~2.20.1",
      "date-fns": "~1.29.0"
  },
  // ...
}

// .babelrc
{
  "presets": ["env", "stage-1", "react"]
}

基本上类似(更多的防错但我简化了逻辑):

import Moment from 'moment.js'
import 'moment/min/locales'

class Localizer {
  localizeDate(value, locale, displayFormat = "L", parseFormat = "LTS") {
    return Moment(date, parseFormat, locale).format(displayFormat);
  }
}

问题是,如果moment.js是一件好事,它就像一个石头背包,你不会把它带到50英里的路上,特别是如果你只需要在一个整个应用程序中本地化一个日期。带宽方面,它不值得IMO(实际上也有很多人的意见)。

所以我正在考虑转换到更轻的库,例如date-fns,但我想出了一个我认为更好的选项: 如果我们可以让对方选择哪个图书馆最适合他呢?

我正在考虑定义与库相关的本地化程序的不同实现,并根据安装的peerDependency有条件地导入它们:

// /Date/DateFnsLocalizer.js
import { parse } from 'date-fns/parse'
import { format } from 'date-fns/format'

class DateFnsLocalizer {
  localizeDate(value, locale, displayFormat = "L") {
    return format(parse(date), displayFormat, { locale })
  }
}

在JavaScript中甚至可以吗?

// /Localizer.js
if (isModuleDefined('moment.js')) {
  import BaseLocalizer from './Date/MomentLocalizer'
} else if (isModuleDefined('date-fns')) {
  import BaseLocalizer './Date/DateFnsLocalizer'
} else if (isModuleDefined('some-other-lib')) {
  import BaseLocalizer './Date/SomeOtherLibLocalizer'
} else {
  throw new Error('No date library defined! Please install at least one of ["moment.js", "date-fns", "some-other-lib"]')
}

export default class Localizer extends BaseLocalizer

我认为“import”语句必须作为文件中的第一个语句。也许使用require代替......(如ES6: Conditional & Dynamic Import Statements中所述)?是否可以在不导入模块的情况下测试模块的存在(基本上如何编写isModuleDefined()方法?)

我也见过那些:

ES6 variable import name in node.js?

How can I conditionally import an ES6 module?

但由于我们目前正在使用babel来转换此库,如果可以使用此架构,是否会导致其他构建工具(例如webpackgulp,{{}中的编译问题1}}等等?

0 个答案:

没有答案