使用Grunt connect的AngularJS html5Mode。咕噜0.4.5

时间:2014-06-18 10:51:44

标签: angularjs gruntjs connect

我最近切换到grunt 0.4.5,它改变了连接的工作方式。

我之前使用过connect-modrewrite,它工作得很好(有/:参数生成的网址存在一些问题)。

这是旧版本,使用grunt 0.4.1 from generator-angular 0.8.0,中间件部分由我修改为使用html5mode。

connect: {
    options: {
        port: 9000,
        hostname: '*IP HERE*',
        livereload: 35729,
        middleware: function (connect, options) {
            var optBase = (typeof options.base === 'string') ? [options.base] : options.base;
            return [require('connect-modrewrite')(['!(\\..+)$ / [L]'])].concat(
                optBase.map(function(path){ return connect.static(path); })
            );
        }
    },
    livereload: {
        options: {
            open: true,
            base: [
                '.tmp',
                '<%= yeoman.app %>'
            ]
        }
    },

这是generator-angular 0.9.0-1

的新版本
connect: {
    options: {
        port: 9000,
        hostname: '*IP HERE*',
        livereload: 35729
    },
    livereload: {
        options: {
            open: true,
            middleware: function (connect) {
                return [
                    connect.static('.tmp'),
                    connect().use(
                        '/bower_components',
                        connect.static('./bower_components')
                    ),
                    connect.static(appConfig.app)
                ];
            }
        }
    },

如何更改此设置以使用mod-rewrite或任何其他方法来实现html5mode?

我尝试使用此处提供的方法:https://gist.github.com/nnarhinen/7719157 我将它结合起来创建了以下内容:

middleware: function (connect) {
    return [
        connect.static(modRewrite(['^[^\\.]*$ /index.html [L]'])),
        connect.static('.tmp'),
        connect().use(
            '/bower_components',
            connect.static('./bower_components')
        ),
        connect.static(appConfig.app)
    ];
}

这允许我查看普通视图,但modRewrite部分似乎没有做它需要的东西,以便通过url访问任何其他视图。

4 个答案:

答案 0 :(得分:65)

如果其他人偶然发现这是修复:

(添加的唯一一行是modRewrite行)

livereload: {
    options: {
        open: true,
        middleware: function (connect) {
            return [
                modRewrite(['^[^\\.]*$ /index.html [L]']),
                connect.static('.tmp'),
                connect().use(
                    '/bower_components',
                    connect.static('./bower_components')
                ),
                connect.static(appConfig.app)
            ];
        }
    }
},

确保您在grunt文件的顶部声明了以下内容:

var modRewrite = require('connect-modrewrite');

答案 1 :(得分:6)

鉴于其他答案非常详细且不保留默认grunt-contrib-connect中间件,我想出了使用dedicated middleware – connect-history-api-fallback的解决方案:

npm install connect-history-api-fallback --save-dev
var history = require('connect-history-api-fallback')
//...
connect: {
    options: {
        middleware: function(connect, options, middleware) {
            middleware.unshift(history())
            return middleware
        },
        //...
    },
    //...
}

答案 2 :(得分:2)

虽然上面接受的答案是正确的。我添加了我使用的配置,它在CentOs上完美运行。

以下1到3个步骤是使用$ grunt serve

在本地计算机上使Angularjs干净的URL工作

但是如果你想在服务器上运行它们,特别是 nginx ,你还需要更新nginx配置。 (第4步)

  1. $ npm install connect-modrewrite --save

  2. 编辑你的gruntfile.js。添加在文件顶部

    var modRewrite = require('connect-modrewrite');
    
  3. 然后在middleware

    middleware: function (connect) {
        return [
            modRewrite(['^[^\\.]*$ /index.html [L]']),
            connect.static('.tmp'),
            connect().use('/bower_components',
            connect.static('./bower_components')),
            connect.static(config.app)
        ];
    }
    

    例如。

    // Generated on 2015-11-09 using generator-angular 0.14.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'
    var modRewrite = require('connect-modrewrite');
    
    module.exports = function (grunt) {
    
      // Time how long tasks take. Can help when optimizing build times
      require('time-grunt')(grunt);
    

    3.然后转到Livereload中间件,添加modRewrite

    livereload: {
        options: {
            middleware: function (connect) {
                return [
                    modRewrite([
                      '^[^\\.]*$ /index.html [L]'
                    ]),
                    connect.static('.tmp'),
                    connect().use('/bower_components', connect.static('./bower_components')),
                    connect.static(config.app)
                ];
            }
        }
    },
    

    4.编辑NGINX配置:

    server {
        server_name yoursite.com;
        root /usr/share/html;
        index index.html;
    
        location / {
        try_files $uri $uri/ /index.html;
        }
    }
    

    希望有所帮助:)

答案 3 :(得分:1)

这是我的解决方案,适用于generator-angular设置,但可以在任何地方使用。它允许重写语法(有趣的部分是示例livereload configuarion)。

connect: {
  options: {
    port: 9000,
    // Change this to '0.0.0.0' to access the server from outside.
    hostname: 'localhost',
    livereload: 35729,
    // Modrewrite rule, connect.static(path) for each path in target's base
    middleware: function (connect, options) {
      var optBase = (typeof options.base === 'string') ? [options.base] : options.base,
          middleware = [require('connect-modrewrite')(['!(\\..+)$ / [L]'])]
            .concat(optBase.map(function (path) { 
              if (path.indexOf('rewrite|') === -1) {
                return connect.static(path);
              } else {
                path = path.replace(/\\/g, '/').split('|');
                return  connect().use(path[1], connect.static(path[2]))
              }
            }));

      return middleware;
    }
  },
  livereload: {
    options: {
      open: true,
      base: [
        '.tmp',
        'rewrite|/bower_components|./bower_components',
        'rewrite|/app/styles|./app/styles', // for sourcemaps
        '<%= yeoman.app %>'
      ]
    }
  }
}