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

Javascript 将节点模块添加到ember CLI应用程序,javascript,node.js,ember.js,npm,ember-cli,Javascript,Node.js,Ember.js,Npm,Ember Cli,我想在我的Ember CLI应用程序中使用这个Node.js模块 如何使其可用于Ember应用程序 我尝试将其添加到Brocfile.js app.import('node_modules/remarkable-regexp/index.js'); 但它是这样失败的: 路径或模式“node_modules/regexp/index.js”未找到 匹配任何文件 由于卓越的regexp是一个npm模块,我认为将其与ember cli集成的最佳方法是使用 在您的ember cli应用程序中,您可以通

我想在我的Ember CLI应用程序中使用这个Node.js模块

如何使其可用于Ember应用程序

我尝试将其添加到
Brocfile.js

app.import('node_modules/remarkable-regexp/index.js');
但它是这样失败的:

路径或模式“node_modules/regexp/index.js”未找到 匹配任何文件


由于
卓越的regexp
是一个npm模块,我认为将其与ember cli集成的最佳方法是使用

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

因此,您可以使用ES6Import导入模块,方法是在模块前面加上
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>
从“npm:卓越”导入卓越;
从“npm:Exceptive regexp”导入插件;
var plugin=插件(
//要匹配的regexp
/@(\w+/,
//当某些内容匹配时,将调用此函数
功能(匹配、UTIL){
var url='1〕http://example.org/u/“+匹配[1]
返回“”
}
)
新的
.使用(插件)
.render(“hello@user”)
//打印出:
//你好


browserify noise可能是首选方法,但我在vendor文件夹中创建了一个符号链接,如下所示:

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


ember-browserify
是在应用程序中使用的一个很好的选择,可以尝试允许ember-CLI导入NPM包,而无需任何额外的帮助

但是,如果您试图在插件和应用程序中实现这一点,您可以采取稍微不同的方法,即手动修改西兰花构建链以包含您的节点包

这是一个如何在插件的
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团队增加了对节点模块的支持,这个方法就会被取代,所以请尽量少用它,并与Ember CLI保持同步

将您的ember cli更新为
v2.15.0-beta.1
。新版本允许您使用
app.import
node\u模块


有关更多信息,请查看自Ember CLI 2.15.0起的

,您现在可以。为了演示,请确保您的应用程序位于Ember CLI 2.15.0上,然后尝试安装Moment.js:

  • 纱线添加力矩
  • app.import('node_modules/moment/moment.js')
    添加到
    ember cli build.js
    文件中
  • 现在,您可以通过
    窗口
    对象:
    窗口访问力矩。力矩
  • (可选)如果希望能够从“力矩”导入力矩,可以生成供应商垫片。有关详细信息,请参阅

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

    您是通过
    npm install--save dev regexp
    安装模块的吗?这非常有效,谢谢。我只担心所有
    browserify
    s依赖项在文件大小和处理时间方面带来的开销。@Hedge browserify本身是一个相当大的项目,但使用ember browserify,构建输出只长四行。以下是添加到您的应用程序中的内容:这对我来说很有用,因为我需要在加载项中导入npm模块。但开始看到此错误:BrockolimergeTrees:预期的Brockoli节点,未定义inputNodes[0]这是因为
    参数有一个
    未定义的
    值,导致
    合并树
    中出现异常。我更改的代码:`var nodes=[packageTree];if(tree){nodes.unshift(tree);}返回合并树(nodes)`只要您不需要支持缺少对符号链接(例如Windows)的可靠支持的文件系统,并且您如何将其导入component.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');
      }
    };