代码之家  ›  专栏  ›  技术社区  ›  Chris Nevill Trevor Johns

ember fastboot/don't import node_modules脚本

  •  1
  • Chris Nevill Trevor Johns  · 技术社区  · 6 年前

    我首先要指出的是,我是从这里交叉发帖的: https://github.com/ember-fastboot/ember-cli-fastboot/issues/621 到目前为止,这个问题还没有引起任何关注,所以我正在向更广泛的社区开放。

    我正在尝试使ember cli slick fastboot兼容。 它使用来自节点模块的slick.js,如下所示:

    included: function(app) {
    this._super.included(app);
    
    app.import("node_modules/slick-carousel/slick/slick.js");
    

    我想让树商工作,但运气不好。 我在跟踪文件 https://www.ember-fastboot.com/docs/addon-author-guide#third-party-dependencies 但我怀疑它的目标是Bower而不是NPM/node_模块。

    treeForVendor(defaultTree) {        
        var browserVendorLib = new Funnel('node_modules/slick-carousel/slick/slick.js');    
    
        browserVendorLib = map(browserVendorLib, (content) => `if (typeof FastBoot === 'undefined') { ${content} }`);
    
        return new mergeTrees([defaultTree, browserVendorLib]);
      },
    

    这会导致错误:

    生成错误(花椰菜持久过滤器:映射器)

    enotdir:不是目录,scandir 'projectdir/tmp/broccoli_persistent_filtermapper-input_base_path-foinixjr.tmp/'

    我也试过了

      treeForVendor(defaultTree) {        
        var map = require("broccoli-stew").map;
        var Funnel = require("broccoli-funnel");
        const mergeTrees = require('broccoli-merge-trees');
    
        let tree=new Funnel('node_modules/slick-carousel/slick/', {
          destDir: 'slick-carousel',
          files: ['slick.js']
        })
    
        tree = map(tree, (content) => `if (typeof FastBoot === 'undefined') { ${content} }`);
    
    
        return new mergeTrees([defaultTree, tree]);
      },
    

    这至少建立了..但是我回到了快速引导错误

    引用错误:jquery未在处定义 projectfolder/tmp/broccoli_merge_trees-output_path-8cgo0zcl.tmp/assets/node_modules/slick carousel/slick/slick.js:25:1

    我已经创建了一个干净的空Ember插件项目,其中只包含import和treeforvendor函数来演示这个问题。 https://github.com/MrChriZ/ember-slicker

    1 回复  |  直到 6 年前
        1
  •  0
  •   Chris Nevill Trevor Johns    6 年前

    有几件事我错过了,也许加载项指南可以更清楚。

    首先,我认为漏斗图采用的是目录路径,而不是完整的文件路径。在此基础上,路径必须是完整的文件路径。这并没有立即从FastBoot插件指南中清除。
    所以看起来像这样:

    const assetDir = path.join(this.project.root, 'node_modules', 'slick-carousel', 'slick');
           var browserVendorLib = new Funnel(assetDir, {
             files: ['slick.js'],
             destDir: 'slick'
           });    
    

    你不能做的是

    const assetDir = path.join(this.project.root, 'node_modules', 'slick-carousel', 'slick', 'slick.js);
    var browserVendorLib = new Funnel(assetDir);
    

    这会引发:

    enotdir:不是目录

    我相信,因为漏斗期望的是目录路径而不是文件路径。

    其次,在包含的hook gaurav中,在github上正确地指出了导入语句需要更改为指向供应商目录。

    所以我的最终解决方案是:

    treeForVendor(defaultTree) {        
       var map = require("broccoli-stew").map;
       var Funnel = require("broccoli-funnel");
       const mergeTrees = require('broccoli-merge-trees');
    
       const assetDir = path.join(this.project.root, 'node_modules', 'slick-carousel', 'slick');
       var browserVendorLib = new Funnel(assetDir, {
         files: ['slick.js'],
         destDir: 'slick'
       });    
    
       browserVendorLib = map(browserVendorLib, (content) => `if (typeof FastBoot === 'undefined') { ${content} }`);
    
       return new mergeTrees([defaultTree, browserVendorLib]);
     },
     included: function(app) {
       this._super.included(app);
    
       app.import('node_modules' + '/slick-carousel/slick/slick.css');
       app.import('node_modules'+ '/slick-carousel/slick/slick-theme.css');
       app.import('node_modules' + '/slick-carousel/slick/fonts/slick.ttf', { destDir: 'assets/fonts' });
       app.import('node_modules' + '/slick-carousel/slick/fonts/slick.svg', { destDir: 'assets/fonts' });
       app.import('node_modules' + '/slick-carousel/slick/fonts/slick.eot', { destDir: 'assets/fonts' });
       app.import('node_modules' + '/slick-carousel/slick/fonts/slick.woff', { destDir: 'assets/fonts' });
       app.import('node_modules' + '/slick-carousel/slick/ajax-loader.gif', { destDir: 'assets' });
    
       // import the above library into vendor.js that was merged with the vendor trees. In browser the library will be eval'd and run
       // In fastboot, the library will not be eval'd
       app.import('vendor/slick/slick.js');
     }