Skip to content

Instantly share code, notes, and snippets.

@j15e
Created January 13, 2015 19:51
Show Gist options
  • Save j15e/83275f0e91c24bf3f711 to your computer and use it in GitHub Desktop.
Save j15e/83275f0e91c24bf3f711 to your computer and use it in GitHub Desktop.
app details ember-cli perf regression

Our setup details below. Our Brocfile.js is quite custom so there might be an issue with something there.

app:              373 files, 1.4MB total
bower_components: 1075 files, 14MB total
node_modules:     39 000 files, 184MB
vendor:           10 files, 193KB

package.json

{
  "name": "x",
  "version": "0.0.0",
  "private": true,
  "directories": {
    "doc": "doc",
    "test": "test"
  },
  "scripts": {
    "start": "ember server",
    "install": "bower install --config.interactive=false",
    "build": "ember build",
    "build-deployment": "ember build --environment=production",
    "test": "ember test --environment=test"
  },
  "repository": "https://github.com/stefanpenner/ember-cli",
  "engines": {
    "node": ">= 0.10.5"
  },
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "broccoli-asset-rev": "^2.0.0",
    "broccoli-ember-hbs-template-compiler": "^1.7.0",
    "ember-cli": "0.1.5",
    "ember-cli-content-security-policy": "0.3.0",
    "ember-cli-dependency-checker": "0.0.7",
    "ember-cli-inject-live-reload": "^1.3.0",
    "ember-cli-qunit": "0.1.2",
    "ember-data": "1.0.0-beta.11",
    "express": "^4.10.2",
    "glob": "^4.0.6",

    "body-parser": "^1.9.2",
    "bower": "^1.3.12",
    "broccoli-autoprefixer": "^1.1.0",
    "broccoli-file-creator": "^0.1.0",
    "broccoli-gzip": "^0.2.0",
    "broccoli-merge-trees": "^0.2.1",
    "broccoli-sass": "^0.3.3",
    "broccoli-static-compiler": "^0.2.1",
    "connect-restreamer": "^1.0.1",
    "dotenv": "^0.4.0",
    "ember-cli-pagination": "^0.5.2",
    "http-proxy": "^1.6.2",
    "originate": "0.1.5",
    "phantomjs": "^1.9.12",
    "qd-ajax": "git://github.com/hooktstudios/qd-ajax.git#master"
  }
}

bower.json

{
  "name": "x",
  "dependencies": {
    "ember": "1.7.1",
    "ember-cli-shims": "stefanpenner/ember-cli-shims#0.0.3",
    "ember-cli-test-loader": "rjackson/ember-cli-test-loader#0.0.4",
    "ember-data": "v1.0.0-beta.11",
    "ember-easyForm": "http://builds.dockyard.com.s3.amazonaws.com/ember-easyForm/release/daily/20140207/ember-easyForm.js",
    "ember-flash-message": "https://raw.githubusercontent.com/ryanto/ember-flash-message/308adc8288844eb918b869d3adae6f1d1b913260/flash-message.js",
    "ember-i18n": "jamesarosen/ember-i18n#52a3b55ac95aa79b8810cca05588ed5638bae299",
    "ember-load-initializers": "stefanpenner/ember-load-initializers#0.0.2",
    "ember-qunit": "~0.1.8",
    "ember-qunit-notifications": "0.0.4",
    "ember-resolver": "~0.1.11",
    "handlebars": "~1.3.0",
    "html5shiv": "~3.7.2",
    "ic-ajax": "~2.0.1",
    "jquery": "^1.11.1",
    "jquery-file-upload": "~9.7.0",
    "loader.js": "stefanpenner/loader.js#1.0.1",
    "mediaelement": "~2.16.1",
    "moment": "~2.8.3",
    "normalize-scss": "~3.0.1",
    "numeral": "~1.5.3",
    "qunit": "~1.15.0",
    "rangy-official": "~1.3.0-alpha.20140827",
    "route-recognizer": "~0.1.1",
    "video.js": "~4.11.3",
    "videojs-vimeo": "eXon/videojs-vimeo#54f88a4de0e24ef77c1a8287462db64e2f6f6147",
    "videojs-youtube": "~1.2.7"
  },
  "resolutions": {
    "video.js": "~4.11.3",
    "route-recognizer": "~0.1.1"
  }
}

Brocfile.js

/* global require, module */
var glob = require('glob');
var path = require('path');
var mergeTrees  = require('broccoli-merge-trees');
var compileSass = require('broccoli-sass');
var assetRev = require('broccoli-asset-rev');
var pickFiles = require('broccoli-static-compiler');
var autoprefixer = require('broccoli-autoprefixer');
var gzip = require('broccoli-gzip');
var writeFile = require('broccoli-file-creator');
var appDotEnv = require('./config/app-dotenv');

var EmberApp = require('ember-cli/lib/broccoli/ember-app');

var app = new EmberApp({
  name: require('./package.json').name,
  // Disabled here to avoid double fingerprints
  fingerprint: {
    enabled: false
  },
  vendorFiles: {
    polyfills: 'vendor/polyfills.js'
  },

  sourcemaps: {
    enabled: false,
    extensions: []
  }
});

app.import('vendor/raven.js');
app.import({
  development: 'bower_components/ember-data/ember-data.js',
  production:  'bower_components/ember-data/ember-data.prod.js'
});
app.import({
  development: 'bower_components/moment/min/moment-with-locales.js',
  production:  'bower_components/moment/min/moment-with-locales.min.js'
});
app.import({
  development: 'bower_components/video.js/dist/video-js/video-js.css',
  production: 'bower_components/video.js/dist/video-js/video-js.min.css'
})
app.import({
  development: 'bower_components/video.js/dist/video-js/video.dev.js',
  production: 'bower_components/video.js/dist/video-js/video.js'
});
app.import({
  development: 'bower_components/videojs-youtube/src/youtube.js',
  production: 'bower_components/videojs-youtube/dist/vjs.youtube.js'
})
app.import({
  development: 'bower_components/videojs-vimeo/src/media.vimeo.js',
  production: 'bower_components/videojs-vimeo/vjs.vimeo.js'
})
app.import('bower_components/ember-i18n/lib/i18n.js');
app.import('bower_components/jquery-file-upload/js/vendor/jquery.ui.widget.js');
app.import('bower_components/jquery-file-upload/js/jquery.iframe-transport.js');
app.import('bower_components/jquery-file-upload/js/jquery.fileupload.js');
app.import('vendor/transloadit.js');
app.import('vendor/transloadit.fr.js');
app.import('vendor/jquery.payment.js');
app.import('vendor/jquery.number.js');
app.import('vendor/ios-drag-drop.js');
app.import('bower_components/ember-flash-message/index.js');
app.import('bower_components/ember-easyForm/index.js');
app.import('bower_components/numeral/numeral.js');
app.import({
  development: 'bower_components/rangy-official/rangy-core.js',
  production:  'bower_components/rangy-official/rangy-core.min.js'
});

// Use `app.import` to add additional libraries to the generated
// output files.
//
// If you need to use different assets in different
// environments, specify an object as the first parameter. That
// object's keys should be the environment name and the values
// should be the asset to use in that environment.
//
// If the library that you are including contains AMD or ES6
// modules that you would like to import into your application
// please specify an object with the list of modules as keys
// along with the exports of each module as its value.

// Add clients custom styles
var clientTrees = glob.sync('clients/**/styles.scss').map(function(file) {
  var dirname = path.dirname(file),
      clientName = dirname.split('/').pop(),
      options = {},
      tree;

  if (app.env === 'production') options = { outputStyle: 'compressed' };

  tree = compileSass([dirname], 'styles.scss', 'assets/' + clientName + '.css', options);

  return tree;
});

var videojsAssets = pickFiles('bower_components/video.js/dist/video-js', {
  srcDir: '/',
  files: ['font/vjs.*', 'video-js.swf'],
  destDir: '/assets'
});

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

var singleVendors = pickFiles('vendor', {
  srcDir: '/',
  files: ['es5-shim.js', 'backend.js'],
  destDir: '/assets'
})

var html5shiv = pickFiles('bower_components/html5shiv/dist', {
  srcDir: '/',
  files: ['html5shiv.js'],
  destDir: '/assets'
})

var tree = mergeTrees(clientTrees.concat(app.toTree(), videojsAssets, fonts, singleVendors, html5shiv));

// Add fingerprints & gziping
if (app.env === 'production') {
  var options = {
    generateRailsManifest: true,
    extensions: ['js', 'css', 'png', 'jpg', 'gif', 'eot', 'svg', 'ttf', 'woff'],
    replaceExtensions: ['html', 'js', 'css', 'hbs']
  };

  // Temporary fix for broccoli-asset-rev#18 & videojs vendor
  options.exclude = [
    'vjs.eot',
    'vjs.svg',
    'vjs.ttf',
    'vjs.woff',
    'video-js.swf'
  ];

  if(appDotEnv.ASSET_HOST){
    options.prepend = 'https://' + appDotEnv.ASSET_HOST + '/';
  }
  tree = assetRev(tree, options);

  gzipOptions = {
    extensions: ['js', 'css', 'svg'],
    keepUncompressed: true
  }
  tree = gzip(tree, gzipOptions)
}

tree = autoprefixer(tree);

// Robots.txt
var robotsSrc = 'User-agent: *';
if(appDotEnv.ROBOTS_DISALLOW === 'true') {
  robotsSrc += '\nDisallow: /';
} else {
  robotsSrc += '\nAllow: /';
}

var robots = writeFile('/robots.txt', robotsSrc);

tree = mergeTrees([tree, robots]);

module.exports = tree;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment