在 ember-cli 中导入依赖项(例如,导入 math.js)

Import dependencies in ember-cli (e.g., import math.js)

我对在 ember-cli 中导入依赖项感到困惑,尤其是关于标准 AMD 的情况,如 official Ember Cli document. The document doesn't provide much of examples, and seems to me it assumes the readers have good knowledge about AMD, which is not the case for me. My immediate use case is import math.js. Unfortunately, the official document of math.js doesn't provide example about importing with Ember Cli. Then, I found this post 中提到的,有相对清晰的示例,特别是以下一个似乎很相关.

app.import({
  development: 'vendor/lodash/dist/lodash.js',
  production:  'vendor/lodash/dist/lodash.min.js'
}, {
  'lodash': [
    'default'
  ]
}); 

然后,我用 math.js 做了类似的事情,如下所示:

app.import({
  development: 'bower_components/mathjs/dist/math.js',
  production:  'bower_components/mathjs/dist/math.min.js'
}, {
  'mathjs': [
    'default'
  ]
});

但是,它不起作用。当我尝试将它与

一起使用时
import mathjs from 'mathjs'

我收到一个错误。最终,我使用了以下解决方案:

// Brocfile.js
app.import('bower_components/mathjs/dist/math.min.js');

// some controller.js
var math = window.math

虽然上述解决方案有效,但我不喜欢它,因为它可能会受到名称冲突的影响。此外,根据 math.js 的文档,在我看来它应该支持标准的 AMD 类型的导入。

所以,我的问题如下。
1、上面的lodash例子中,'default'是什么意思?这是对相应模块中导出的任何内容的一般引用吗?怎么判断能不能通用(比如math.js)?
2. 如果模块支持require.js,那么它是标准的AMD模块吗?如果是这样,给出如下代码:

require.config({
  paths: {
    mathjs: 'path/to/mathjs',
  }
});
require(['mathjs'], function (math) {
  // use math.js
  math.sqrt(-4); // 2i
});

如何将它映射到 Ember CLI 代码?

这有点麻烦,但是由于 mathjs 没有 expose/support 命名的 AMD 模块,所以您不能在 app.import.

中使用额外的语法

您有两个选择:

  1. ember-browserify(如果库支持 CommonJS - mathjs 支持)
  2. 自己“填充”依赖库

1。 ember-浏览器化

  1. 安装ember-browserify

    ember install ember-browserify

  2. 将 CommonJS 库安装为 NPM 包

    npm install --save-dev mathjs

  3. 使用具有常规 import 语法的 NPM 包

    import mathjs from 'npm:mathjs';

2。匀场

您需要做的是“填充”库以通过 import 语句使其可用。我还是不知道shim这个词是什么意思<:

如果您有兴趣创建一个 bower 包,例如ember-cli-mathjs-shim 然后您可以使用它并让其他人也可以使用它。这方面的一些例子是:

ember-cli-shims

ember-cli-moment-shim

ember-cli-sockjs-shim

但如果您不愿意这样做,我建议您将以下内容添加到您的项目中:

vendor/shims/math.js - 在 vendor 下创建一个 shims 文件夹(vendor 是你依赖的地方,不是来自 NPM 或 Bower - 并且 Brocfile 似乎没有能够从除此处以外的任何地方 app.import - 例如 app/shims 或根级别的简单 shims 不起作用)

vendor/shims/math.js

(function() {
  /* globals define, math */

  function mathJSModule() {
    'use strict';

    return { 'default': math };
  }

  define('mathjs', [], mathJSModule);

})();

Brocfile.js

app.import('bower_components/mathjs/dist/math.js');
app.import('vendor/shims/math.js', {
  exports: {
    'mathjs': [ 'default' ]
  }
});

这里的顺序很重要。