define(['angular', 'angular-route'], function (angular) {
  var app = angular.module('plunker', ['ngRoute']);
  console.log('loading app');
  
  app.controller('MainCtrl', function($scope, $location) {
    console.log('MainCtrl path:', $location.path());
    $scope.name = 'World';
  });
  
  console.log('done configuring app');
  
  return app;
});
<!DOCTYPE html>
<html>

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-main="main.js" src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.11/require.min.js"></script>
    
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    
    <div ng-view>
      
    </div>
  </body>

</html>
/* Put your css in here */

define([
  'services/lazyService'
], core.controller('LazyCtrl', function () {
  
  console.log('LazyCtrl module loaded');
  return function LazyCtrl($scope, lazyService) {
    console.log('LazyCtrl controller invoked!', lazyService);
    $scope.valueA = lazyService.valueForController;
  };
  
}));
(function() {
  requirejs.config({
    paths: {
      angular: 'http://code.angularjs.org/1.2.15/angular',
      'angular-route': 'http://code.angularjs.org/1.2.15/angular-route',
      jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.0/jquery.min',
      underscore: '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min'
    },
    shim: {
      angular: {
        exports: 'angular',
        deps: ['jquery']
      },
      'angular-route': {
        deps: ['angular']
      },
      jquery: {
        exports: '$'
      },
      underscore: {
        exports: '_'
      }
    }
  });
  
  require([
    'jquery',
    'angular',
    'app',
    'core',
    'routes'
  ], function ($, angular, app) {
    $('<base href="' + location.href + '" />').appendTo($('head'));
    var $html = $('html');
    $html.prop('id', 'ng-app');
    angular.bootstrap($html, [app.name]);
  });
}());
define([], core.service('lazyService', function() {
  
  return [function () {
    console.log('lazyService service')
    return {
      valueForController: 'foo',
      valueForDirective: 'bar'
    };
  }];
  
}));
(function (global) {
  define(['angular', 'underscore', 'app'], function (angular, _, app) {
  
    function page(config) {
      console.log('core - configuring', config.path, config);
      var pageConfig = angular.extend({ resolve: {} }, _.omit(config, 'dependencies'));
      
      if (config.dependencies) {
        var resolvables = _.object(config.dependencies, _.map(config.dependencies, function (dep) {
          return function ($q, $rootScope) {
            var deferred = $q.defer();
            console.log('core - loading', dep);
            require([dep], function () {
              $rootScope.$apply(function () {
                deferred.resolve();
              })
            });
            return deferred.promise;
          }
        }));
        
        angular.extend(pageConfig.resolve, resolvables, pageConfig.resolve);
      }
      
      console.log('core - configured', pageConfig.path, pageConfig);
      return pageConfig;
    }
  
    console.log('configuring core', app);
    var core = {
      page: page
    };
    
    app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide) {
      
      function registrar(provider) {
        return function register(name, moduleConstructor) {
          return function moduleWrapper() {
            console.log('core - register', name, provider, app);
            provider.register(name, moduleConstructor.apply(global, arguments));
          };
        };
      }
      
      function provider(type) {
        return function register(name, moduleConstructor) {
          return function moduleWrapper() {
            console.log('core - register', name, type, app);
            app[type](name, moduleConstructor.apply(global, arguments));
          };
        }
      }
      
      function directive(name, moduleConstructor) {
        return function moduleWrapper() {
          console.log('core - register', name, app);
          $compileProvider.directive(name, moduleConstructor.apply(global, arguments));
        };
      }
      
      function service(name, moduleConstructor) {
        $provide.service(name, moduleConstructor.apply(global, arguments));
      }
      
      angular.extend(core, {
        app: app,
        controller: registrar($controllerProvider),
        directive: directive,
        service: service
      });
    });
    
    global.core = core;
    return core;
  });
}(this));
define([
  'services/lazyService'
], core.directive('lazyDirective', function () {
  
  console.log('lazyDirective - generating module');
  return function lazyDirective(lazyService) {
  console.log('lazyDirective - generating directive');
    return function postLink($scope) {
      console.log('lazyDirective link', lazyService);
      $scope.valueB = lazyService.valueForDirective;
    };
  };
}));
define([
  'underscore',
  'app',
  'pages',
  
  'angular-route'
], function (_, app, pages) {

  app.config(['$locationProvider', '$routeProvider', function ($locationProvider, $routeProvider) {
    $locationProvider
      .html5Mode(true)
      .hashPrefix('!');
    
    _.each(pages, function (page) {
      $routeProvider.when(page.path, page);
    });
  }]);
  
});
define([
  'core',
  'pages/index'
], function (core, index) {
  
  return {
    index: core.page(index)
  };
})
define({
  path: '/',
  dependencies: [
    'controllers/LazyCtrl',
    'directives/lazyDirective'
  ],
  resolve: {
    foo: function () {
      console.log('index!');
      return 'foo';
    }
  },
  templateUrl: 'views/index.html'
});
<div ng-controller="LazyCtrl">
  values: {{valueA}} <span lazy-directive>{{valueB}}</span>
</div>