【问题标题】:Recommended way to include bootstrap library in Ember.JS ember-cli App在 Ember.JS ember-cli App 中包含引导库的推荐方法
【发布时间】:2014-06-14 12:33:19
【问题描述】:

我正在尝试在我当前的 ember-cli 项目中正确安装 Twitter Bootstrap。 我确实用凉亭安装了引导程序:

bower install --save bootstrap

现在该库已下载到 /vendor/bootstrap/dist/(css|js|fonts) 我尝试了这里提到的内容:http://ember-cli.com/#managing-dependencies 替换路径和 css 文件名,但我收到有关 Brocfile.js 文件的错误。我认为 brocfile 格式与示例相比变化太大了。

在移动 /app/styles/ 目录中的样式表后,我还尝试使用 /app/styles/app.css 文件 @import:

@import url('/assets/bootstrap.css');
@import url('/assets/bootstrap-theme.css');

但它没有工作。这些文件是可见的真正的开发服务器:http://localhost:4200/assets/bootstrap.css

有人可以在这里扔我一根骨头吗?

谢谢

编辑:

ember -v
ember-cli 0.0.23

brocfile.js

    /* global require, module */

var uglifyJavaScript = require('broccoli-uglify-js');
var replace = require('broccoli-replace');
var compileES6 = require('broccoli-es6-concatenator');
var validateES6 = require('broccoli-es6-import-validate');
var pickFiles = require('broccoli-static-compiler');
var mergeTrees = require('broccoli-merge-trees');

var env = require('broccoli-env').getEnv();
var getEnvJSON = require('./config/environment');

var p = require('ember-cli/lib/preprocessors');
var preprocessCss = p.preprocessCss;
var preprocessTemplates = p.preprocessTemplates;
var preprocessJs = p.preprocessJs;

module.exports = function (broccoli) {

  var prefix = 'caisse';
  var rootURL = '/';

  // index.html

  var indexHTML = pickFiles('app', {
    srcDir: '/',
    files: ['index.html'],
    destDir: '/'
  });

  indexHTML = replace(indexHTML, {
    files: ['index.html'],
    patterns: [{ match: /\{\{ENV\}\}/g, replacement: getEnvJSON.bind(null, env)}]
  });

  // sourceTrees, appAndDependencies for CSS and JavaScript

  var app = pickFiles('app', {
    srcDir: '/',
    destDir: prefix
  });

  app = preprocessTemplates(app);

  var config = pickFiles('config', { // Don't pick anything, just watch config folder
    srcDir: '/',
    files: [],
    destDir: '/'
  });

  var sourceTrees = [app, config, 'vendor'].concat(broccoli.bowerTrees());
  var appAndDependencies = mergeTrees(sourceTrees, { overwrite: true });

  // JavaScript

  var legacyFilesToAppend = [
    'jquery.js',
    'handlebars.js',
    'ember.js',
    'ic-ajax/dist/named-amd/main.js',
    'ember-data.js',
    'ember-resolver.js',
    'ember-shim.js',
    'bootstrap/dist/js/bootstrap.js'
  ];

  var applicationJs = preprocessJs(appAndDependencies, '/', prefix);

  applicationJs = compileES6(applicationJs, {
    loaderFile: 'loader/loader.js',
    ignoredModules: [
      'ember/resolver',
      'ic-ajax'
    ],
    inputFiles: [
      prefix + '/**/*.js'
    ],
    legacyFilesToAppend: legacyFilesToAppend,
    wrapInEval: env !== 'production',
    outputFile: '/assets/app.js'
  });

  if (env === 'production') {
    applicationJs = uglifyJavaScript(applicationJs, {
      mangle: false,
      compress: false
    });
  }

  // Styles

  var styles = preprocessCss(appAndDependencies, prefix + '/styles', '/assets');

  // Bootstrap Style integration
  var bootstrap = pickFiles('vendor', {
    srcDir: '/bootstrap/dist/css',
    files: [
      'bootstrap.css',
      'bootstrap-theme.css'
    ],
    destDir: '/assets/'
  });

//var bootstrap = preprocessCss(appAndDependencies, '/vendor/bootstrap/dist/css', '/assets');

  // Ouput

  var outputTrees = [
    indexHTML,
    applicationJs,
    'public',
    styles,
    bootstrap
  ];

  // Testing

  if (env !== 'production') {

    var tests = pickFiles('tests', {
      srcDir: '/',
      destDir: prefix + '/tests'
    });

    var testsIndexHTML = pickFiles('tests', {
      srcDir: '/',
      files: ['index.html'],
      destDir: '/tests'
    });

    var qunitStyles = pickFiles('vendor', {
      srcDir: '/qunit/qunit',
      files: ['qunit.css'],
      destDir: '/assets/'
    });

    testsIndexHTML = replace(testsIndexHTML, {
      files: ['tests/index.html'],
      patterns: [{ match: /\{\{ENV\}\}/g, replacement: getEnvJSON.bind(null, env)}]
    });

    tests = preprocessTemplates(tests);

    sourceTrees = [tests, 'vendor'].concat(broccoli.bowerTrees());
    appAndDependencies = mergeTrees(sourceTrees, { overwrite: true });

    var testsJs = preprocessJs(appAndDependencies, '/', prefix);

    var validatedJs = validateES6(mergeTrees([app, tests]), {
      whitelist: {
        'ember/resolver': ['default'],
        'ember-qunit': [
          'globalize',
          'moduleFor',
          'moduleForComponent',
          'moduleForModel',
          'test',
          'setResolver'
        ]
      }
    });

    var legacyTestFiles = [
      'qunit/qunit/qunit.js',
      'qunit-shim.js',
      'ember-qunit/dist/named-amd/main.js'
    ];

    legacyFilesToAppend = legacyFilesToAppend.concat(legacyTestFiles);

    testsJs = compileES6(testsJs, {
      // Temporary workaround for
      // https://github.com/joliss/broccoli-es6-concatenator/issues/9
      loaderFile: '_loader.js',
      ignoredModules: [
        'ember/resolver',
        'ember-qunit'
      ],
      inputFiles: [
        prefix + '/**/*.js'
      ],
      legacyFilesToAppend: legacyFilesToAppend,

      wrapInEval: true,
      outputFile: '/assets/tests.js'
    });

    var testsTrees = [qunitStyles, testsIndexHTML, validatedJs, testsJs];
    outputTrees = outputTrees.concat(testsTrees);
  }

  return mergeTrees(outputTrees, { overwrite: true });
};

【问题讨论】:

  • 你能展示你的 ember-cli 版本和 Brocfile.js 内容吗?
  • 还包括在 /styles 中复制后通过 index.html 工作。

标签: twitter-bootstrap ember.js bower ember-cli


【解决方案1】:

在终端上(对于那些使用节点包管理器的人)

npm install bootstrap --save

使用 ember-cli,导入已安装的引导程序

打开ember-cli-build.js 文件

module.exports = function(defaults) {
  let app = new EmberApp(defaults, {
    // Add options here
  });
app.import('node_modules/bootstrap/dist/css/bootstrap.min.css');
app.import('node_modules/bootstrap/dist/js/bootstrap.min.js');

如果 bootstrap 是通过 NPM 安装程序安装的。

不要这样做:

app.import('./node_modules/bootstrap/dist/css/bootstrap.min.css');
app.import('./node_modules/bootstrap/dist/js/bootstrap.min.js');

【讨论】:

    【解决方案2】:

    重击:

    bower install --save bootstrap
    

    Brocfile.js:

    app.import('vendor/bootstrap/dist/js/bootstrap.js');
    app.import('vendor/bootstrap/dist/css/bootstrap.css');
    

    js会添加到默认链接的app.js中,CSS会添加到assets/vendor.css,截至5月14日也默认添加。

    供参考:http://www.ember-cli.com/#managing-dependencies

    在回答@Joe 关于字体和其他资产的问题时,我无法获得推荐的 app.import() 方法来处理字体。相反,我选择了合并树和静态编译器方法:

    var mergeTrees = require('broccoli-merge-trees');
    var pickFiles = require('broccoli-static-compiler');
    var extraAssets = pickFiles('vendor/bootstrap/dist/fonts',{
        srcDir: '/', 
        files: ['**/*'],
        destDir: '/fonts'
    });
    
    module.exports = mergeTrees([app.toTree(), extraAssets]);
    

    【讨论】:

    • 并重新启动服务器,因为 Livereload 不会自动获取对 brocfile 的更改...我认为 :)
    • 如果您使用 ember-cli v0.0.35 或更新版本,您可能需要在 package.json 中包含几个 Broccoli 插件。您可以通过以下方式添加它们:npm install --save-dev broccoli-merge-treesnpm install --save-dev broccoli-static-compiler
    • 请注意,现在'vendor' 已被'bower_components' 替换为任何安装了bower 的东西。 'vendor' 文件夹仍可用于用户指定的库。
    • 您也可以使用app.import('vendor/bootstrap/dist/fonts/glyphicons-halflings-regular.woff', { destDir: 'fonts' });导入字体查看以下链接miguelcamba.com/blog/2014/08/10/…
    • 我生成的项目似乎也请求了 boostrap.css.map,所以我也添加了下面的代码行。 app.import('bower_components/bootstrap/dist/css/bootstrap.css.map', { destDir: 'assets' });
    【解决方案3】:

    如果您使用的是 SASS(可能通过 ember-cli-sass),bower_components 会自动添加到查找路径中。这意味着您可以只使用 Bower 而完全避免使用 Brocfile/ember-cli-build 文件。

    使用 Bower 安装官方 SASS 版本的 Bootstrap

    bower install --save bootstrap-sass
    

    然后将库导入app.scss。这样做的好处是您可以在导入引导程序之前自定义变量:

    $brand-primary: 'purple';
    
    @import 'bower_components/bootstrap-sass/assets/stylesheets/bootstrap';
    

    【讨论】:

    • 或 $ ember install ember-cli-sass $ ember install ember-cli-bootstrap-sassy 然后将 app.css 重命名为 app.scss 并在其中添加这一行:@import "bootstrap"跨度>
    【解决方案4】:

    您可能想查看ember-bootstrap,它将自动导入引导资产。

    ember install ember-bootstrap
    

    此外,它还为您的应用添加了一套原生 ember 组件,这使得在 ember 中使用引导功能变得更加容易。看看吧,虽然我有点偏见,因为我是它的作者! ;)

    【讨论】:

    • 此命令足以将任何现有的 ember 项目转换为引导程序。谢谢西蒙。
    • ember-bootstrap 非常棒!但是,其中缺少的组件是轮播。如果您需要轮播来工作,那么您将需要通过 @rastapasta 说明安装引导组件——似乎 ember-bootstrap 不包含 transitions.js 作为它引入的引导资产的一部分,这是轮播需要。
    • @RyanNerd 谢谢!是的,旋转木马仍然不见了。但希望在即将发布的 1.0 版本后不久添加!
    【解决方案5】:
    bower install --save bootstrap
    

    在你的brocfile.js:

    app.import('bower_components/bootstrap/dist/js/bootstrap.js');
    app.import('bower_components/bootstrap/dist/css/bootstrap.css');
    

    【讨论】:

    • 我不知道为什么这实际上被降价了。除非您知道将这些语句放在哪里,否则可能不太清楚。但它工作得很好......也许不如我承认的插件那么好。他们进入ember-cli-build.js 文件,如果有人需要,它们可以正常工作。我将我的 ember 作为 Asp.Net MVC 项目从内部提供,并且需要它可用于该项目,而不仅仅是 ember 应用程序。
    【解决方案6】:
    $> bower install --save bootstrap
    

    然后将以下两行添加到您的 ember-cli-builds.js(或 Brocfile.js,如果您使用的是旧版本的 Ember.js):

    app.import(app.bowerDirectory + '/bootstrap/dist/js/bootstrap.js');
    app.import(app.bowerDirectory + '/bootstrap/dist/css/bootstrap.css');
    

    瞧,准备好了!

    于 2015 年 8 月 18 日更新:适应于 Ember.js 1.13 中引入的新方案

    【讨论】:

    • 最新版本的 ember-cli 不再包含 brocfile.js
    • @MadScientist ,您可以使用“ember-cli-build.js”进行导入,上述步骤仍然有效。 (余烬:1.12.6)
    • 如何将此方法与 bootswatch.com/flatly 等引导覆盖相结合
    【解决方案7】:

    2015 年 3 月 30 日更新

    另外还有一个变化...我现在使用ember-cli-bootstrap-sassy,它似乎带来了最小的麻烦,同时仍然让我自定义 Bootstrap 的变量。


    2015 年 1 月 22 日更新

    您可能应该使用上面 Johnny 的解决方案,而不是我最初提到的 lib。我也喜欢ember-cli-bootstrap-sass,因为我可以直接在我的项目中自定义Bootstrap的变量。

    原创 2014 年 7 月 11 日

    如果您使用的 ember-cli 版本支持插件(我相信是 0.35+),您现在可以使用 ember-cli-bootstrap 包。从应用的根目录,

    npm install --save-dev ember-cli-bootstrap
    

    就是这样!

    注意:正如@poweratom 指出的那样,ember-cli-bootstrap 是其他人的库,它选择也包含bootstrap-for-ember。因此,这个库可能与官方引导版本不同步。但是,我仍然认为这是在新项目中快速制作原型的好方法!

    【讨论】:

    • 将当前版本更改为当前版本。当前(0.0.39)甚至可能不是您正在使用的版本...
    • 目前 ember-cli-bootstrap 不包含 bootstrap.js,因此您希望能够使用内置的 javascript 方法或各种插件。
    • 我不确定这是否应该是安装它本身的“推荐”方式。 “ember-cli-bootstrap”项目依赖于“bootstrap-for-ember”项目。不幸的是,根据后一个项目的维护者的说法,他宣布他现在正在开发“ember-components”项目作为其继任者。因此,除非努力从他离开的地方继续(我相信该项目目前正在使用 bootstrap 3.0.0),否则 Bootstrap 版本很快就会过时(已经过时了)。
    【解决方案8】:

    重击:

    bower install --save bootstrap
    

    Brocfile.js:

    /* global require, module */
    
    ...
    
    
    app.import('bower_components/bootstrap/dist/css/bootstrap.css');
    app.import('bower_components/bootstrap/dist/css/bootstrap.css.map', {
        destDir: 'assets'
    });
    app.import('bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot', {
        destDir: 'fonts'
    });
    app.import('bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf', {
        destDir: 'fonts'
    });
    app.import('bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg', {
        destDir: 'fonts'
    });
    app.import('bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff', {
        destDir: 'fonts'
    });
    app.import('bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2', {
        destDir: 'fonts'
    });
    
    app.import('bower_components/bootstrap/dist/js/bootstrap.js');
    
    module.exports = app.toTree();
    

    【讨论】:

    • 这是 ember 1.9 的好方法,直到 ember-cli-bootstrap 被撞到为车把构建 >=2.0
    • Sean O'Hara 在评论 Drew 的回答时所说的命令应该添加到这里:npm install --save-dev broccoli-merge-trees && npm install --save-dev broccoli-static-compiler
    • @TimoLehto cli 比这个 broc 导入有什么优势?
    • @SuperUberDuper,对不起,伙计。我不明白这问题。什么cli?你在说什么?
    • @genkilabs 没有看到 cli-bootstrap 的意义,如上所示很简单
    【解决方案9】:

    这就是我使用 Broccoli(它是 Ember-cli 的基础)打包供应商 CSS 文件的方式。

     var vendorCss = concat('vendor', {
       inputFiles: [
         'pikaday/css/pikaday.css'
       , 'nvd3/nv.d3.css'
       , 'semantic-ui/build/packaged/css/semantic.css'
       ]
      , outputFile: '/assets/css/vendor.css'
      });
    

    vendor 文件夹是我的 Bower 包所在的位置。 assets 是我希望我的 CSS 存在的地方。我假设你已经使用 Bower 安装了 Bootstrap,这是 Ember-cli 的方式。

    然后在我的 index.html 中,我只是引用了 vendor.css 文件:

      <link href="/assets/css/vendor.css" rel="stylesheet" type="text/css" media="all">
    

    干杯。

    【讨论】:

    • 我试过了,但它告诉我 concat 在 Broccoli 中未定义(ReferenceError: concat 未定义)我补充说,只需更改文件中包含样式表的路径:Brocfile.js 在根应用程序文件夹。
    • 安装插件npm install broccoli-concat --save 然后在你的Brocfile中,在顶部:var concat = require('broccoli-concat');
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多