将节点模块添加到 ember CLI 应用程序

Posted

技术标签:

【中文标题】将节点模块添加到 ember CLI 应用程序【英文标题】:Add node module to ember CLI app 【发布时间】:2015-03-27 20:54:51 【问题描述】:

我想在我的 Ember-CLI 应用程序中使用这个 Node.js 模块 https://www.npmjs.com/package/remarkable-regexp。

如何使其对 Ember 应用程序可用?

我尝试将其添加到Brocfile.js

app.import('node_modules/remarkable-regexp/index.js');

但它会像这样失败:

路径或模式“node_modules/remarkable-regexp/index.js”没有 匹配任何文件

【问题讨论】:

你是通过npm install --save-dev remarkable-regexp安装模块的吗? 【参考方案1】:

从 Ember-CLI 2.15.0 开始,您现在可以import node modules directly。为了演示,请确保您的应用在 Ember-CLI 2.15.0 上,然后尝试安装 Moment.js:

    yarn add momentapp.import('node_modules/moment/moment.js') 添加到您的ember-cli-build.js 文件中。 您现在可以通过window 对象访问时刻:window.moment。 (可选)如果您希望能够import moment from 'moment',您可以生成供应商 shim。详情请见this link。

这不适用于不提供单个 javascript 捆绑包的节点模块(您需要使用其他 cmets 中描述的方法进行捆绑),但这已经是一个巨大的改进。

【讨论】:

【参考方案2】:

将您的 ember-cli 更新为 v2.15.0-beta.1。新版本允许您使用app.importnode_modules

更多信息请查看https://github.com/ember-cli/ember-cli/pull/7045

【讨论】:

【参考方案3】:

由于remarkable-regexp 是一个npm 模块,我相信将它与ember-cli 集成的最佳方式是使用ember-browserify。

在您的 ember-cli 应用程序中,您可以通过运行 npm install --save-dev ember-browserify 来安装插件

因此,您可以使用 ES6 导入通过在其前面加上 npm: 前缀来导入模块

import Remarkable from 'npm:remarkable';
import Plugin from 'npm:remarkable-regexp';

var plugin = Plugin(
  // regexp to match
  /@(\w+)/,

  // this function will be called when something matches
  function(match, utils) 
    var url = 'http://example.org/u/' + match[1]

    return '<a href="' + utils.escape(url) + '">'
      + utils.escape(match[1])
      + '</a>'
  
)

new Remarkable()
  .use(plugin)
  .render("hello @user")

// prints out:
// <p>hello <a href="http://example.org/u/user">user</a></p>

【讨论】:

效果很好,谢谢。我只担心所有browserifys 依赖项引入的文件大小和处理时间开销。 @Hedge Browserify 本身是一个相当大的项目,但是使用 ember-browserify 你的构建输出只长了四行。以下是添加到您的应用程序中的内容:hastebin.com/avukejoxid.js【参考方案4】:

ember-browserify 是在应用程序中使用的绝佳选择,work being done 尝试允许 Ember CLI 导入 NPM 包而无需任何额外帮助。

但是,如果您尝试在插件和应用程序中都使用此功能,您可以采取稍微不同的方法,即手动修改 broccoli 构建链以包含您的 Node 包。

这是如何在插件的index.js 文件中完成此操作的一个简单示例:

var path = require('path');
var mergeTrees = require('broccoli-merge-trees');
var Funnel = require('broccoli-funnel');

module.exports = 
  name: 'my-addon',

  treeForVendor: function(tree) 
    var packagePath = path.dirname(require.resolve('node-package'));
    var packageTree = new Funnel(this.treeGenerator(packagePath), 
      srcDir: '/',
      destDir: 'node-package'
    );
    return mergeTrees([tree, packageTree]);
  ,

  included: function(app) 
    this._super.included(app);

    if (app.import) 
      this.importDependencies(app);
    
  ,

  importDependencies: function(app) 
    app.import('vendor/node-package/index.js');
  
;

类似的技术可用于标准应用程序。同样,随着 Ember CLI 团队添加对 Node 模块的支持,此方法将很快被替换,因此请尽量少用它并与 Ember CLI 保持同步!

【讨论】:

这对我有用,因为我需要在插件中导入一个 npm 模块。但开始看到这个错误: BroccoliMergeTrees: Expected Broccoli node, got undefined for inputNodes[0] 这是因为tree 参数有一个undefined 值导致mergeTrees 出现异常。我更改的代码:` var nodes = [packageTree];如果(树)节点.unshift(树); 返回合并树(节点); `【参考方案5】:

browserify 噪音可能是首选方法,但我通过在供应商文件夹中创建符号链接来绕过它,如下所示:

$ npm install --save-dev css.escape
$ cd vendor
$ ln -s ../node_modules/css.escape/css.escape.js css.escape.js

然后

// ember-cli-build.js
app.import('vendor/css.escape.js');

【讨论】:

应该可以工作,只要您不需要支持对符号链接缺乏可靠支持的文件系统(例如 Windows) 以及如何在你的component.js中导入它

以上是关于将节点模块添加到 ember CLI 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ember-cli 中导入 amd 模块?

将 emberJS 应用程序更新为 ember-cli 和 data 3.28 后出现阻塞错误

在映像URL中动态添加资产前缀 - Ember-CLI

未捕获的错误:找不到模块“ember-qunit”。奇怪的开箱即用的 ember-cli 行为

在 ember-file-upload 的请求标头中添加身份验证令牌

ember-cli 元配置/环境文件