AngularJS html5Mode с использованием соединения Grunt. ворчать 0,4,5
Недавно я переключился на хрен на 0,4.5, и он изменил способ работы сокета.
Я ранее использовал connect-modrewrite, и он работал довольно хорошо (имели некоторые проблемы с URL-адресами, сгенерированными параметром /:).
Вот старая версия, которая работала с grunt 0.4.1 от генератора 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 %>'
]
}
},
Вот новая версия от генератора 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.
Ответы
Ответ 1
Если кто-то еще сталкивается с этим, это исправление:
(единственной добавленной линией была строка 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');
Ответ 2
Учитывая, что другие ответы довольно подробные и не сохраняют значения по умолчанию grunt-contrib-connect
middlewares, я придумал решение, которое использует выделенное промежуточное ПО - 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
},
//...
},
//...
}
Ответ 3
Хотя выше принятый ответ правильный. Я добавляю конфигурацию, которую я использую, она отлично работает на CentOs.
Ниже от 1 до 3 шагов предназначены для того, чтобы очистить URL-адрес Urularjs на локальном компьютере с помощью $ 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.Edit Конфигурация NGINX:
server {
server_name yoursite.com;
root /usr/share/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
Надеюсь, что это поможет:)
Ответ 4
Вот мое решение, адаптированное к настройке generator-angular
, но может быть использовано в любом месте. Он позволяет использовать синтаксис перезаписи (интересной частью является пример конфигурации с помощью функции переадресации).
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 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 %>'
]
}
}
}