页面重新加载时Angular应用程序中的Grunt URL重写

Sim*_*aur 11 javascript legacy gruntjs angular

以下是Grunt文件中livereload块的样子:

livereload: {
  options: {
    open: true,
    middleware: function(connect, options, middleware) {
      var optBase = typeof options.base === "string" 
        ? [options.base] 
        : options.base;

      return [
        [
          require("connect-modrewrite")(["!(\\..+)$ / [L]"])
        ].concat(
          optBase.map(function(path) { return connect.static(path); })
        ),
        connect.static(".tmp"),
        connect().use("/bower_components", connect.static("./bower_components")),
        connect().use("/app/styles", connect.static("./app/styles")),
        connect.static(appConfig.app)
      ];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我的网址有'.' (期间),Grunt无法重新加载页面.我在我的Angular应用程序中使用HTML5模式并且工作正常.

请问我能知道哪一部分

[
  require("connect-modrewrite")(["!(\\..+)$ / [L]"])
].concat(
  optBase.map(function (path) { return connect.static(path); })
)
Run Code Online (Sandbox Code Playgroud)

导致它失败,我该如何解决这个问题?

注意:仅在页面重新加载时失败.我第一次访问它工作的路线,然后如果我点击刷新它失败.

Tod*_*odd 1

我能否知道 [此片段] 的哪一部分导致其失败以及如何解决此问题?

此处的规则connect-modrewrite似乎仅用于重写非静态资产 URL。

[
  require("connect-modrewrite")(["!(\\..+)$ / [L]"])
].concat(
  optBase.map(function (path) { return connect.static(path); })
)
Run Code Online (Sandbox Code Playgroud)

此处传入的规则"!(\\..+)$ / [L]"是一种反向 URL 匹配规则,用于将所有包含句点和一个或多个字符的 URL重写回基本 URL ( /)。因此,如果您的路线包含句点,它们将不会被重写...这就是实时重新加载运行时失败的原因。

解决这个问题的一个建议是更明确地避免对静态资产的请求进行重写:

    require("connect-modrewrite")([
      '!\\.html|\\.js|\\.svg|\\.css|'
      + '\\.scss.*|\\.woff.*|\\.gif.*|\\.png$ '
      // etc...
      + '/ [L]'
    ])
Run Code Online (Sandbox Code Playgroud)

请注意,此规则也以感叹号 ( !) 开头。它不是仅仅依赖于句点的存在,而是更明确地针对不包含某些文件扩展名的 URL - 以及句点!(:

注意:建议的代码可以在 searchcode.com 上找到

我希望这有帮助!HMU 如有任何问题、更正或实际情况。