代码之家  ›  专栏  ›  技术社区  ›  nightmaredevil2010

在angularjs的模式中启用html5模式时会发生什么?

  •  1
  • nightmaredevil2010  · 技术社区  · 7 年前

    当您启用html5模式时,实际会发生什么?这可能要追溯到单页应用程序中如何进行路由的问题

    我之前所感觉到的(可能是错误的):看着angularjs应用程序中的脏url,我总是假设它是url片段,不同的视图绑定到不同的片段。简而言之,我们已经拥有了所有页面,并且针对特定url显示了特定片段。

    现在,为了删除散列,必须将html5mode设置为true,并且必须告诉服务器返回除API之外的每个请求的索引页。有点像

    app.get('/ap1',some);
    //more apis 
    *
    *
    *
    //in the end
    app.get('*' ,(req,res,next) => req.sendFile('index.html'));
    

    该请求是否应该在每次url更改时发送到服务器并重新加载页面?

    html5mode对浏览器有什么作用?在诸如react和angular(2或更高版本)等较新的框架中,您甚至不必启用HTML5模式(angular 2除外,在angular 2中,您必须告诉自己想要什么类型的url)。

    这是什么魔法?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Quentin    7 年前

    这使用 History API .

    它的设计使开发人员能够:

    • 告诉浏览器“我已经使用JavaScript更改了页面的内容。现在它与您要求的页面相同 /other/page "
    • 拦截点击 返回 向前地 这样他们就可以使用JS将页面的内容更改为与URL相同的内容,如果没有拦截单击后退/前进,则可以导航到URL。

    这将更新浏览器历史记录和地址栏中的URL,而不会触发到新页面的正常导航。这样做的目的是,如果您链接到页面或稍后返回页面,您可以在页面之间提供更平滑、更快的转换,同时仍然具有工作良好的真实URL。

    这样做:

    • 如果JavaScript由于任何原因失败,真正的URL仍然可以传递页面
    • 如果搜索引擎为URL编制索引,它将从中获取真实数据
    • 如果访问者访问的URL不是主页,他们会立即获得所需的内容,而无需等待JavaScript运行,发出额外的Ajax请求,并在客户端组装所有内容。

    它是针对使用 hangbangs 而不是真正的URL。


    现在,为了删除散列,必须将html5mode设置为true,并且必须告诉服务器返回除API之外的每个请求的索引页

    这是来自Angular的可怕建议。

    它放弃了history API可以提供的所有好东西,以具有Hashbang的所有缺点,但使用了外观更好的URL。

    正确执行的问题是,它需要复制服务器和客户机上的逻辑,这是一项大量的工作。 Isomorphic JavaScript 是一种减少此工作量的方法。


    html5mode对浏览器有什么作用?

    没有什么这个 html5mode 通过角度读取变量。浏览器并不直接关心它。它告诉Angular使用历史API而不是hangbang URL。


    在诸如react和angular(2或更高版本)等较新的框架中,您甚至不必启用HTML5模式(angular 2除外,在angular 2中,您必须告诉自己想要什么类型的url)。

    默认情况下,它们只使用历史API。