我最近切换到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? p>
我尝试使用此处提供的方法: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访问任何其他视图。
答案 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
但是如果你想在服务器上运行它们,特别是 nginx ,你还需要更新nginx配置。 (第4步)
$ npm install connect-modrewrite --save
编辑你的gruntfile.js。添加在文件顶部
var modRewrite = require('connect-modrewrite');
然后在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 %>'
]
}
}
}