简体   繁体   中英

I just built my AngularJS project using gruntjs, but when I load the result in my browser, I get a blank page, how do I begin debugging this?

When I built my project, I had Grunt copy everything to ~/Web, which is where Apache serves pages from. I've tried running grunt build --debug --verbose and getting back no errors or warnings. I've also thrown up the idea that it's a problem on my machine, but after trying to load it on a friend's macbook and testing it with every major browser, nothing happens. Something's not firing, I'm just not sure what.

JavaScript console output:

Failed to load resource: the server responded with a status of 404 (Not Found)       http://vm-2.levicampbell.koding.kd.io/styles/vendor.css
Uncaught object vm-2.levicampbell.koding.kd.io/scripts/1b24ff92.vendor.js:11
Uncaught object vm-2.levicampbell.koding.kd.io/scripts/1b24ff92.vendor.js:6
GET http://vm-2.levicampbell.koding.kd.io/styles/vendor.css 404 (Not Found) vm-    2.levicampbell.koding.kd.io/:1
Uncaught object 1b24ff92.vendor.js:11
e 1b24ff92.vendor.js:11
(anonymous function) 1b24ff92.vendor.js:17
Uncaught object 1b24ff92.vendor.js:6
(anonymous function) 1b24ff92.vendor.js:6
(anonymous function) 1b24ff92.vendor.js:6
f 1b24ff92.vendor.js:6
k 1b24ff92.vendor.js:6
Hb 1b24ff92.vendor.js:6
$.e 1b24ff92.vendor.js:6
$ 1b24ff92.vendor.js:6
Z 1b24ff92.vendor.js:6
(anonymous function) 1b24ff92.vendor.js:9
k 1b24ff92.vendor.js:4
l.fireWith 1b24ff92.vendor.js:4
eb.extend.ready 1b24ff92.vendor.js:4
h

Gruntfile.js:

// Generated on 2014-06-28 using generator-angular 0.8.0
'use strict';

// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to recursively match all subfolders:
// 'test/spec/**/*.js'

module.exports = function (grunt) {

  // Load grunt tasks automatically
  require('load-grunt-tasks')(grunt);

  // Time how long tasks take. Can help when optimizing build times
  require('time-grunt')(grunt);

  // Define the configuration for all the tasks
  grunt.initConfig({

    // Project settings
    yeoman: {
      // configurable paths
      app: require('./bower.json').appPath || 'app',
      dist: '/home/levicampbell/Web'
    },

    // Watches files for changes and runs tasks based on the changed files
    watch: {
      bower: {
        files: ['bower.json'],
        tasks: ['bowerInstall']
      }
    },
      js: {
        files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
        tasks: ['newer:jshint:all'],
        options: {
          livereload: true
        }
      },
      jsTest: {
        files: ['test/spec/{,*/}*.js'],
        tasks: ['newer:jshint:test', 'karma']
      },
      gruntfile: {
        files: ['Gruntfile.js']
      },
      livereload: {
        options: {
          livereload: '<%= connect.options.livereload %>'
        },
        files: [
          '<%= yeoman.app %>/{,*/}*.html',
          '.tmp/styles/{,*/}*.css',
          '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
        ]
      },
      phonegap: {
        config: {
          root: 'www',
          config: 'www/config.xml',
          cordova: '.cordova',
          html : 'index.html',
          path: 'mobile',
          plugins: ['/local/path/to/plugin', 'http://example.com/path/to/plugin.git'],
          platforms: ['android', 'ios', 'wp8', 'bb10'],
          maxBuffer: 500,
          verbose: true,
          releases: 'releases',
          releaseName: function(){
            var pkg = grunt.file.readJSON('package.json');
            return(pkg.name + '-' + pkg.version);
          },
          debuggable: true,
          name: function(){
            var pkg = grunt.file.readJSON('package.json');
            return pkg.name;
          },
          key: {
            store: 'release.keystore',
            alias: 'release',
            aliasPassword: function(){
              return('');
            },
            storePassword: function(){
              return('');
            }
          },
          icons: {
            android: {
              ldpi: 'icon-36-ldpi.png',
              mdpi: 'icon-48-mdpi.png',
              hdpi: 'icon-72-hdpi.png',
              xhdpi: 'icon-96-xhdpi.png'
            },
            wp8: {
              app: 'icon-62-tile.png',
              tile: 'icon-173-tile.png'
            },
            ios: {
              icon29: 'icon29.png',
              icon29x2: 'icon29x2.png',
              icon40: 'icon40.png',
              icon40x2: 'icon40x2.png',
              icon57: 'icon57.png',
              icon57x2: 'icon57x2.png',
              icon60x2: 'icon60x2.png',
              icon72: 'icon72.png',
              icon72x2: 'icon72x2.png',
              icon76: 'icon76.png',
              icon76x2: 'icon76x2.png'
            }
          },
          screens: {
            android: {
              ldpi: 'screen-ldpi-portrait.png',
              ldpiLand: 'screen-ldpi-landscape.png',
              mdpi: 'screen-mdpi-portrait.png',
              mdpiLand: 'screen-mdpi-landscape.png',
              hdpi: 'screen-hdpi-portrait.png',
              hdpiLand: 'screen-hdpi-landscape.png',
              xhdpi: 'screen-xhdpi-portrait.png',
              xhdpiLand: 'www/screen-xhdpi-landscape.png'
            },
            ios: {
              ipadLand: 'screen-ipad-landscape.png',
              ipadLandx2: 'screen-ipad-landscape-2x.png',
              ipadPortrait: 'screen-ipad-portrait.png',
              ipadPortraitx2: 'screen-ipad-portrait-2x.png',
              iphonePortrait: 'screen-iphone-portrait.png',
              iphonePortraitx2: 'screen-iphone-portrait-2x.png',
              iphone568hx2: 'screen-iphone-568h-2x.png'
            }
          },
          versionCode: function(){ return(1) },
          minSdkVersion: function(){ return(10) },
          targetSdkVersion: function(){ return(19) },
          iosStatusBar: 'WhiteAndTransparent',
          remote: {
            username: 'john@example.com',
            password: 'fakepassword',
            platforms: ['android', 'blackberry', 'ios', 'symbian', 'webos', 'wp7']
          },
          permissions: ['INTERNET', 'ACCESS_COURSE_LOCATION', '...']
        }
      },
      s3: {
        options: {
          key: 'yeahright',
          secret: 'notonyourlife',
          bucket: 'production',
          access: 'public-read',
          gzip: true,
          encodePaths: true,
          maxOperations: 0,
          headers: {
            // Two Year cache policy (1000 * 60 * 60 * 24 * 730)
            "Cache-Control": "max-age=630720000, public",
            "Expires": new Date(Date.now() + 63072000000).toUTCString()
          }
        },
        prod: {
          // Files to be uploaded.
          upload: [
            {
              src: '<%= yeoman.dist %>/index.html',
              dest: 'index.html',
            },
            {
              src: '<%= yeoman.dist %>/styles/vendor.css',
              dest: 'styles/vendor.css'
            },
            {
              src: '<%= yeoman.dist %>/styles/main.css',
              dest: 'styles/main.css'
            },
            {
              src: '<%= yeoman.dist %>/scripts/vendor.js',
              dest: 'scripts/vendor.js'
            },
            {
              src: '<%= yeoman.dist %>/scripts/scripts.js',
              dest: 'scripts/scripts.js'
            },
            {
              src: '<%= yeoman.dist %>/404.html',
              dest: '404.html'
            },
            {
              src: '<%= yeoman.dist %>/favicon.ico',
              dest: 'favicon.ico'
            },
            {
              src: '<%= yeoman.dist %>/dict.json',
              dest: 'dict.json'
            },
            {
              src: '<%= yeoman.dist %>/robots.txt',
              dest: 'robots.txt'
            },
            {
              src: '<%= yeoman.dist %>/views/*.html',
              dest: 'views'
            },
            {
              src: '<%= yeoman.dist %>/jalarast.js.map',
              dest: 'jalarast.js.map'
            }
          ]}
  },

    // The actual grunt server settings
    connect: {
      options: {
        port: 9000,
        // Change this to '0.0.0.0' to access the server from outside.
        hostname: 'localhost',
        livereload: 35729
      },
      livereload: {
        options: {
          open: true,
          base: [
            '.tmp',
            '<%= yeoman.app %>'
          ]
        }
      },
      test: {
        options: {
          port: 9001,
          base: [
            '.tmp',
            'test',
            '<%= yeoman.app %>'
          ]
        }
      },
      dist: {
        options: {
          base: '<%= yeoman.dist %>'
        }
      }
    },

    // Make sure code styles are up to par and there are no obvious mistakes
    jshint: {
      options: {
        jshintrc: '.jshintrc',
        reporter: require('jshint-stylish')
      },
      all: [
        'Gruntfile.js',
        '<%= yeoman.app %>/scripts/{,*/}*.js'
      ],
      test: {
        options: {
          jshintrc: 'test/.jshintrc'
        },
        src: ['test/spec/{,*/}*.js']
      }
    },

    // Empties folders to start fresh
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            '.tmp',
            '<%= yeoman.dist %>/*',
            '!<%= yeoman.dist %>/.git*'
          ]
        }]
      },
      server: '.tmp'
    },

    // Add vendor prefixed styles
    autoprefixer: {
      options: {
        browsers: ['last 1 version']
      },
      dist: {
        files: [{
          expand: true,
          cwd: '.tmp/styles/',
          src: '{,*/}*.css',
          dest: '.tmp/styles/'
        }]
      }
    },

    // Automatically inject Bower components into the app
    bowerInstall: {
      app: {
        src: ['<%= yeoman.app %>/index.html'],
        ignorePath: '<%= yeoman.app %>/'
      },
      sass: {
        src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        ignorePath: '<%= yeoman.app %>/bower_components/'
      }
    },

    // Compiles Sass to CSS and generates necessary files if requested
    compass: {
      options: {
        sassDir: '<%= yeoman.app %>/styles',
        cssDir: '.tmp/styles',
        generatedImagesDir: '.tmp/images/generated',
        imagesDir: '<%= yeoman.app %>/images',
        javascriptsDir: '<%= yeoman.app %>/scripts',
        fontsDir: '<%= yeoman.app %>/styles/fonts',
        importPath: '<%= yeoman.app %>/bower_components',
        httpImagesPath: '/images',
        httpGeneratedImagesPath: '/images/generated',
        httpFontsPath: '/styles/fonts',
        relativeAssets: false,
        assetCacheBuster: false,
        raw: 'Sass::Script::Number.precision = 10\n'
      },
      dist: {
        options: {
          generatedImagesDir: '<%= yeoman.dist %>/images/generated'
        }
      },
      server: {
        options: {
          debugInfo: true
        }
      }
    },

    // Renames files for browser caching purposes
    rev: {
      dist: {
        files: {
          src: [
            '<%= yeoman.dist %>/scripts/{,*/}*.js',
            '<%= yeoman.dist %>/styles/{,*/}*.css',
            '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
            '<%= yeoman.dist %>/styles/fonts/*'
          ]
        }
      }
    },

    // Reads HTML for usemin blocks to enable smart builds that automatically
    // concat, minify and revision files. Creates configurations in memory so
    // additional tasks can operate on them
    useminPrepare: {
      html: '<%= yeoman.app %>/index.html',
      options: {
        dest: '<%= yeoman.dist %>',
        flow: {
          html: {
            steps: {
              js: ['concat', 'uglifyjs'],
              css: ['cssmin']
            },
            post: {}
          }
        }
      }
    },

    // Performs rewrites based on rev and the useminPrepare configuration
    usemin: {
      html: ['<%= yeoman.dist %>/{,*/}*.html'],
      css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
      options: {
        assetsDirs: ['<%= yeoman.dist %>']
      }
    },

    // The following *-min tasks produce minified files in the dist folder
    cssmin: {
      options: {
        root: '<%= yeoman.app %>'
      }
    },

    imagemin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/images',
          src: '{,*/}*.{png,jpg,jpeg,gif}',
          dest: '<%= yeoman.dist %>/images'
        }]
      }
    },

    svgmin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.app %>/images',
          src: '{,*/}*.svg',
          dest: '<%= yeoman.dist %>/images'
        }]
      }
    },

    htmlmin: {
      dist: {
        options: {
          collapseWhitespace: true,
          collapseBooleanAttributes: true,
          removeCommentsFromCDATA: true,
          removeOptionalTags: true
        },
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>',
          src: ['*.html', 'views/{,*/}*.html'],
          dest: '<%= yeoman.dist %>'
        }]
      }
    },

    ngAnnotate: {
        options: {
            singleQuotes: true,
        },
        all: {
            files: {
                '.tmp/concat/scripts/scripts.js': ['.tmp/concat/scripts/scripts.js'],
                '.tmp/concat/scripts/vendor.js': ['.tmp/concat/scripts/vendor.js']
            },
        },
    },
    // Replace Google CDN references
    cdnify: {
      dist: {
        html: ['<%= yeoman.dist %>/*.html']
      }
    },

    // Copies remaining files to places other tasks can use
    copy: {
      dist: {
        files: [{
          expand: true,
          dot: true,
          cwd: '<%= yeoman.app %>',
          dest: '<%= yeoman.dist %>',
          src: [
            '*.{ico,png,txt,json,map}',
            '.htaccess',
            '*.html',
            'views/{,*/}*.html',
            'images/{,*/}*.{webp}',
            'fonts/*'
          ]
        }, {
          expand: true,
          cwd: '.tmp/images',
          dest: '<%= yeoman.dist %>/images',
          src: ['generated/*']
        }]
      },
      styles: {
        expand: true,
        cwd: '<%= yeoman.app %>/styles',
        dest: '.tmp/styles/',
        src: '{,*/}*.css'
      }
    },

    // Run some tasks in parallel to speed up the build process
    concurrent: {
      server: [
        'compass:server'
      ],
      test: [
        'compass'
      ],
      dist: [
        'compass:dist',
        'imagemin',
        'svgmin'
      ]
    },

    // By default, your `index.html`'s <!-- Usemin block --> will take care of
    // minification. These next options are pre-configured if you do not wish
    // to use the Usemin blocks.
    // cssmin: {
    //   dist: {
    //     files: {
    //       '<%= yeoman.dist %>/styles/main.css': [
    //         '.tmp/styles/{,*/}*.css',
    //         '<%= yeoman.app %>/styles/{,*/}*.css'
    //       ]
    //     }
    //   }
    // },
    uglify: {
      options: {
        sourceMap: '<%= yeoman.dist %>/jalarast.js.map',
        sourceMapName: '<%= yeoman.dist %>/jalarast.js.map'
      }
    },
    //   dist: {
    //     files: {
    //       '<%= yeoman.dist %>/scripts/scripts.js': [
    //         '<%= yeoman.dist %>/scripts/scripts.js'
    //       ]
    //     }
    //   }
    // },
    // concat: {
    //   dist: {}
    // },

    // Test settings
    karma: {
      unit: {
        configFile: 'karma.conf.js',
        singleRun: true
      }
    }
  });


  grunt.registerTask('serve', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
      'clean:server',
      'bowerInstall',
      'concurrent:server',
      'autoprefixer',
      'connect:livereload',
      'watch'
    ]);
  });

  grunt.registerTask('server', function (target) {
    grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
    grunt.task.run(['serve:' + target]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'concurrent:test',
    'autoprefixer',
    'connect:test',
    'karma'
  ]);

  grunt.registerTask('build', [
    'clean:dist',
    'bowerInstall',
    'useminPrepare',
    'concurrent:dist',
    'autoprefixer',
    'concat',
    'ngAnnotate',
    'copy:dist',
    'cdnify',
    'cssmin',
    'uglify',
    'rev',
    'usemin',
    'htmlmin'
  ]);

  grunt.registerTask('default', [
    'newer:jshint',
    'test',
    'build'
  ]);
};

app/index.html:

<!doctype html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
  <head>
    <meta charset="utf-8">
    <title>{{ Page.title() }}</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width">
    <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
    <!-- build:css styles/vendor.css -->
    <!-- bower:css -->
    <!-- endbower -->
    <!-- endbuild -->
    <!-- build:css({.tmp,app}) styles/main.css -->
    <link rel="stylesheet" href="styles/main.css">
    <!-- endbuild -->
  </head>
  <body ng-app="netnaviApp">
    <!--[if lt IE 7]>
      <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
    <![endif]-->

    <!-- Add your site or application content here -->
    <div class="container" ng-include="'views/main.html'" ng-controller="MainCtrl"></div>
    <div class="container" ng-include="'views/about.html'" ng-controller="AboutCtrl"></div>
    <div class="container" ng-include="'views/faqs.html'" ng-controller="FaqsCtrl"></div>
    <div class="container" ng-include="'views/login.html'" ng-controller="LoginCtrl"></div>
    <div class="container" ng-include="'views/logout.html'" ng-controller="LogoutCtrl"></div>

    <!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
     <script>
       (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
       (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
       m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
       })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

       ga('create', 'UA-XXXXX-X');
       ga('send', 'pageview');
    </script>

    <!--[if lt IE 9]>
    <script src="bower_components/es5-shim/es5-shim.js"></script>
    <script src="bower_components/json3/lib/json3.min.js"></script>
    <![endif]-->

    <!-- build:js scripts/vendor.js -->
    <!-- bower:js -->
    <script src="bower_components/jquery/dist/jquery.js"></script>
    <script src="bower_components/angular/angular.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/affix.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/alert.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/button.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/carousel.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/collapse.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/dropdown.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/tab.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/transition.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/scrollspy.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/modal.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/tooltip.js"></script>
    <script src="bower_components/bootstrap-sass-official/vendor/assets/javascripts/bootstrap/popover.js"></script>
    <script src="bower_components/angular-route/angular-route.js"></script>
    <script src="bower_components/es6-promise/promise.js"></script>
    <script src="bower_components/localforage/dist/localforage.min.js"></script>
    <script src="bower_components/angular-localforage/dist/angular-localForage.js"></script>
    <script src="bower_components/auth0-widget.js/build/auth0-widget.js"></script>
    <script src="bower_components/angular-cookies/angular-cookies.js"></script>
    <script src="bower_components/auth0.js/build/auth0.js"></script>
    <script src="bower_components/auth0-angular/build/auth0-angular.js"></script>
    <script src="bower_components/aws-sdk-js/dist/aws-sdk.js"></script>
    <script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
    <script src="bower_components/pocketsphinx.js-lib/pocketsphinx.js"></script>
    <script src="bower_components/pocketsphinx.js-lib/audioRecorder.js"></script>
    <script src="bower_components/pocketsphinx.js-lib/audioRecorderWorker.js"></script>
    <script src="bower_components/pocketsphinx.js-lib/callbackManager.js"></script>
    <script src="bower_components/pocketsphinx.js-lib/recognizer.js"></script>
    <script src="bower_components/sdk/index.js"></script>
    <script src="bower_components/client/index.js"></script>
    <!-- endbower -->
    <!-- endbuild -->

        <!-- build:js({.tmp,app}) scripts/scripts.js -->
        <script src="scripts/app.js"></script>
        <script src="scripts/controllers/main.js"></script>
        <script src="scripts/controllers/about.js"></script>
        <script src="scripts/controllers/faqs.js"></script>
        <script src="scripts/controllers/login.js"></script>
        <script src="scripts/controllers/logout.js"></script>
        <script src="scripts/services/login.js"></script>
        <script src="scripts/services/sphinx.js"></script>
        <script src="scripts/services/page.js"></script>
        <script src="scripts/services/commands.js"></script>
        <!-- endbuild -->
</body>
</html>

app/scripts/app.js:

'use strict';

var app = angular.module('jalarastApp', ['ngCookies', 'auth0-redirect', 'ngRoute', 'authInterceptor', 'LocalForageModule']);
app.config(function($localForageProvider, $routeProvider, authProvider, $httpProvider) {
    $routeProvider
    .when('/', {
      templateUrl: 'views/main.html',
      controller: 'MainCtrl'
    })
    .when('/logout', {
      templateUrl: 'views/logout.html',
      controller: 'LogoutCtrl'
    })
    .when('/login', {
      templateUrl: 'views/login.html',
      controller: 'LoginCtrl'
    })
    .when('/faqs', {
      templateUrl: 'views/faqs.html',
      controller: 'FaqsCtrl'
    })
    .when('/about', {
      templateUrl: 'views/about.html',
      controller: 'AboutCtrl'
    });
    authProvider.init({
      domain: 'donebox.auth0.com',
      clientID: '5m4OeON4B753SNC18hjqxASTM9mW25gy',
      callbackURL: document.location.href
    });
    $httpProvider.interceptors.push('authInterceptor');
    $localForageProvider.config({
        driver      : 'localStorageWrapper', // if you want to force a driver
        name        : 'jalarast', // name of the database and prefix for your data
        version     : 1.0, // version of the database, you shouldn't have to use this
        storeName   : 'sessions', // name of the table
        description : 'sessions table'
    });
  });

app.run(function() {
  FB.init({
    appId      : '732206430174952',
    status     : true,
    xfbml      : true,
    version    : 'v2.0',
  });
  AWS.config.credentials = new AWS.WebIdentityCredentials({
    RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/auth0',
    ProviderId: 'jalarast.auth0.com',
    WebIdentityToken: 'ACCESS_TOKEN'
  });
});

My google-fu is failing me here. Could someone please point me in the right direction? THank you for your time and consideration.

EDIT: So I just had a burst of insight into this problem. Look up at my app/scripts/app.js, in the routeProvider. going to /about produces a 404, but /views/about.html returns the page sans formatting, so I'm thinking that the routing mechanism isn't finding my views on the filesystem.

Since you're testing on your friend's MacBook, note that ~/Web in OSX by default doesn't map to /home/<username>/Web , but /Users/<username>/Web . Try changing the value for yeoman.dist in your Gruntfile to /Users/levicampbell/Web .

Otherwise, if /home/levicampbell/Web exists and Apache is actually using it, verify that your user account has permissions. You could always run sudo grunt build as a test.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM