在Ember.JS ember-cli App中引入引导库的build议方法
我正在尝试在当前的ember-cli项目中正确安装Twitter Bootstrap。 我确实安装了凉亭bootstrap:
bower install --save bootstrap
现在这个库在/ vendor / bootstrap / dist /(css | js | fonts)中被压缩了,我尝试了这里提到的: http : //ember-cli.com/#managing-dependenciesreplacepath和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-bootstrap 。
ember install ember-bootstrap
此外,它还为您的应用程序添加了一套原生的烬元器件,这使得在烬中使用引导器function变得更加容易。 检查出来,虽然我有点偏见,因为我是它的作者! ;)
BASH:
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()方法来处理字体。 我select了合并树和静态编译器方法:
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]);
BASH:
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();
更新3/30/15
加上ça改变…我现在使用ember-cli-bootstrap-sassy ,它似乎带来了最低限度的cruft,同时让我自定义Bootstrap的variables。
2015年1月22日更新
你应该使用上面的Johnny解决scheme,而不是我最初提到的lib。 我也喜欢ember-cli-bootstrap-sass ,因为我可以直接在我的项目中定制Bootstrap的variables。
原始的7/11/14
如果您使用的是支持插件(0.35+,我相信)的ember-cli版本,那么现在可以使用ember-cli-bootstrap软件包。 从你的应用程序的根,
npm install --save-dev ember-cli-bootstrap
而已!
注意:正如@poweratom指出的那样,
ember-cli-bootstrap
是别人的库,它也select了bootstrap-for-ember 。 因此,这个lib可能会与官方bootstrap版本不同步。 不过,我仍然认为这是一个快速实现新项目原型的好方法!
$> 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');
瞧,准备好了!
更新08/18/2015:适应Ember.js 1.13中引入的新计划
这是我如何打包供应商的CSS文件与西兰花(支持Ember-cli)。
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">
干杯。
如果您使用SASS(可能通过ember-cli-sass
),则bower_components
会自动添加到查找path中。 这意味着你可以使用Bower并完全避免Brocfile / ember-cli-build文件。
用Bower安装官方的SASS Bootstrap版本
bower install --save bootstrap-sass
然后在app.scss
导入lib。 关于这一点的好处是你可以在导入bootstrap之前自定义variables:
$brand-primary: 'purple'; @import 'bower_components/bootstrap-sass/assets/stylesheets/bootstrap';
bower install --save bootstrap
在你的brocfile.js
:
app.import('bower_components/bootstrap/dist/js/bootstrap.js'); app.import('bower_components/bootstrap/dist/css/bootstrap.css');