<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        Angular2+如何去除url中的#號(hào)詳解

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:23:20
        文檔

        Angular2+如何去除url中的#號(hào)詳解

        Angular2+如何去除url中的#號(hào)詳解:前言 本文中主要介紹了關(guān)于Angular2+中去除url中#號(hào)的相關(guān)內(nèi)容,這是最近在工作中遇到的一個(gè)問(wèn)題,覺(jué)著有必要給大家分享下,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。 1. 為什么要去除? Angular官方指出:如果沒(méi)有足夠使用hash風(fēng)格(#)的理由,還是盡
        推薦度:
        導(dǎo)讀Angular2+如何去除url中的#號(hào)詳解:前言 本文中主要介紹了關(guān)于Angular2+中去除url中#號(hào)的相關(guān)內(nèi)容,這是最近在工作中遇到的一個(gè)問(wèn)題,覺(jué)著有必要給大家分享下,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。 1. 為什么要去除? Angular官方指出:如果沒(méi)有足夠使用hash風(fēng)格(#)的理由,還是盡

        前言

        本文中主要介紹了關(guān)于Angular2+中去除url中#號(hào)的相關(guān)內(nèi)容,這是最近在工作中遇到的一個(gè)問(wèn)題,覺(jué)著有必要給大家分享下,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

        1. 為什么要去除?

      1. Angular官方指出:如果沒(méi)有足夠使用hash風(fēng)格(#)的理由,還是盡量使用HTML5模式的路由風(fēng)格;
      2. 如果配置了hash風(fēng)格,在微信支付或是Angular的深路徑依然會(huì)出404的問(wèn)題;
      3. 當(dāng)你需要使用GA等工具時(shí),由于無(wú)法獲取#號(hào)后的URL,導(dǎo)致每次路由切換都給其發(fā)送一個(gè)路徑;
      4. '#'有點(diǎn)丑。
      5. 2. 怎樣才能去除?

        有四個(gè)方法:

      6. 前端 + ngx
      7. 前端 + Apache
      8. 前端 + Tomcat
      9. GithubPages / 碼云 Pages + 404 頁(yè)面
      10. 2.1  前端

        index.html的head里加

        <base href="/" rel="external nofollow" >

        app.module.ts

        import { ROUTER_CONFIG } from './app.routes.ts';
        @NgModule({
         imports: [
         ...
         RouterModule.forRoot(ROUTER_CONFIG) 
         // RouterModule.forRoot(ROUTER_CONFIG, { useHash: true } ) 這樣寫是帶#的
         ], 
        })

        app.routes.ts:

        import { NgModule } from '@angular/core';
        import { Routes } from '@angular/router';
        export const ROUTER_CONFIG: Routes = [
         {
         ...
         }
        ];

        如果只配置前端會(huì)怎么樣?

        如果只配置前端雖然會(huì)去掉'#'但是一刷新頁(yè)面就404,路徑解析上出錯(cuò)了。
        Angular是單頁(yè)應(yīng)用,它實(shí)現(xiàn)了前端路由功能,后臺(tái)可以不再控制路由的跳轉(zhuǎn),將原本屬于后端的業(yè)務(wù)邏輯全部丟給前端。

      11. 用戶刷新頁(yè)面時(shí)(http://gitee.poetry/life),請(qǐng)求是先被提交到了WebServer后臺(tái),后臺(tái)路由沒(méi)有對(duì)應(yīng)頁(yè)面的路由管理,就會(huì)出現(xiàn)404的錯(cuò)誤。
      12. 用戶如果是先訪問(wèn)首頁(yè)(http://gitee.poetry),然后再跳轉(zhuǎn)到 頁(yè)面(http://gitee.poetry/life),則這個(gè)跳轉(zhuǎn)是由Angular前臺(tái)管理的URL,訪問(wèn)是正常的。
      13. 那么我們讓W(xué)ebServer把屬于Angular管理的路由URL,都轉(zhuǎn)發(fā)到index.html就可以解決404的問(wèn)題了,也就是后面介紹的配置信息。

        思考:hash模式為什么不會(huì)404?

        2.2 ngx配置

        帶'***'的是需要自己配置 nginx.conf 文件內(nèi)容

        server {
         listen 80; #監(jiān)聽的端口號(hào) 
         server_name my_server_name; # 服務(wù)器名稱 ***
         root /projects/angular/myproject/dist; #相對(duì)于nginx的位置 ***
         index index.html; #如果index.html存在,就結(jié)束查找過(guò)程,把這個(gè)文件附加到請(qǐng)求的request_uri后面,并且發(fā)起一個(gè)內(nèi)部的redirect。
         location / { # / 是匹配所有的uri后執(zhí)行下面操作
         try_files $uri $uri/ /index.html; #try_files先尋找名為 $uri 文件,沒(méi)有則尋找 $uri/ 文件,再?zèng)]有就尋找/index.html
         }
        }

        try_files 詳細(xì)解釋:

        如請(qǐng)求的是https://deepthan.gitee.io/poetry/life, $uri則是‘/life',如果‘$uri'‘$uri/'都找不到,就會(huì) fall back 到 try_files 的最后一個(gè)選項(xiàng) /index.html發(fā)起一個(gè)內(nèi)部 “子請(qǐng)求”,也就是相當(dāng)于 nginx 發(fā)起一個(gè) HTTP 請(qǐng)求到https://deepthan.gitee.io/poetry/index.html。這個(gè)請(qǐng)求會(huì)被 location ~ .php$ { ... } catch 住,也就是進(jìn)入 FastCGI 的處理程序。而具體的 URI 及參數(shù)是在 REQUEST_URI 中傳遞給 FastCGI 和 WordPress 程序的,因此不受 URI 變化的影響。

        2.3 Apache

        Apache的根目錄新建一個(gè).htaccess文件

        RewriteEngine On 
        # 如果請(qǐng)求的是現(xiàn)有資源,則按原樣執(zhí)行
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] 
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d 
        RewriteRule ^ - [L]
        # 如果請(qǐng)求的資源不存在,則使用index.html
        RewriteRule ^ /index.html 

        2.4 Tomcat配置

        Tomcat/conf/web.xml文件上添加
        <error-page>
         <error-code>404</error-code>
         <location>/</location>
        </error-page>

        2.5 GithubPages / 碼云 Pages + 404 頁(yè)面

        對(duì)于github pages或碼云 Pages來(lái)說(shuō),我們沒(méi)辦法直接配置Github pages,但可以在commit時(shí)添加一個(gè)404頁(yè)。簡(jiǎn)單的解決方案如下:

        我們?cè)陧?xiàng)目的根目錄新建404.html,把index.html中的內(nèi)容完全復(fù)制到404.html中就可以了。這樣做github pages仍然會(huì)在恰當(dāng)?shù)臅r(shí)候給出一個(gè)404響應(yīng),瀏覽器將會(huì)正確處理該頁(yè),并正常加載我們的應(yīng)用。

        關(guān)于這方面的hack: S(GH)PA: The Single-Page App Hack for GitHub Pages

        3. 帶‘#'和不帶‘#'原理上有什么區(qū)別呢?

        3.1  這個(gè)得先說(shuō)下什么是前端路由:

        以前路由都是后臺(tái)做的,通過(guò)用戶請(qǐng)求的url導(dǎo)航到具體的html頁(yè)面,現(xiàn)在我們?cè)谇岸丝梢岳?Angular、vue、react等通過(guò)配置文件,達(dá)到前端控制路由跳轉(zhuǎn)的功能。

        前端路由的實(shí)現(xiàn)方法:

      14. 通過(guò)hash實(shí)現(xiàn) 當(dāng)url的hash發(fā)生改變時(shí),觸發(fā)hashchange注冊(cè)的回調(diào)(低版本沒(méi)有hashchange事件,通過(guò)輪回檢測(cè)url實(shí)現(xiàn)),回調(diào)中去進(jìn)行不同的操作,進(jìn)行不同的內(nèi)容展示。
        使用hash來(lái)實(shí)現(xiàn)的話,URI規(guī)則中要帶上#,路由中#后邊的內(nèi)容就是hash,我們常說(shuō)的錨點(diǎn)嚴(yán)格來(lái)說(shuō)應(yīng)該是頁(yè)面中的a[name]等元素。
      15. HTML5的history api操作瀏覽器的session history實(shí)現(xiàn)
        基于history實(shí)現(xiàn)的路由中不帶#,就是原始的路由
      16. 3.2 Angular中的路由策略

        angular2提供的路由策略也是基于上面兩個(gè)原理實(shí)現(xiàn)的,可以在@NgModule中通過(guò)providers配置或RouterModule.forRoot()配置:

        1) 路由中有#

        @NgModule({
         imports:[RouterModule.forRoot(routes,{useHash:true})]
        })


        @NgModule({
         imports:[RouterModule.forRoot(routes)],
         providers:[
         {provide: LocationStrategy, useClass: HashLocationStrategy} 
         ]
        })

        HashLocationStragegy

        適用于基于錨點(diǎn)標(biāo)記的路徑,比如/#/**,后端只需要配置一個(gè)根路由即可。

        2) html5路由(無(wú)#)

        改用 PathLocationStrategy(angular2的默認(rèn)策略,也就是HTML5路由),使用這個(gè)路由的常規(guī)路徑不帶#,這種策略需要后臺(tái)配置支持,因?yàn)槲覀兊膽?yīng)用是單頁(yè)面應(yīng)用,如果后臺(tái)沒(méi)有正確的配置,當(dāng)用戶在瀏覽器從一個(gè)路由跳往另外一個(gè)路由或者刷新時(shí)就會(huì)返回404,需要在服務(wù)端里面覆蓋所有的路由情況(后端可以通過(guò)nginx或者apache等配置)。

        @NgModule({
         imports:[RouterModule.forRoot(routes)],
         providers:[
         {provide: LocationStrategy, useClass: PathLocationStrategy} 
         // 這一行是可選的,因?yàn)槟J(rèn)的LocationStrategy是PathLocationStrategy
         ]
        })

        更改index.html中的base href屬性,Angular將通過(guò)這個(gè)屬性來(lái)處理路由跳轉(zhuǎn)

        <base href="/app/" rel="external nofollow" rel="external nofollow" >

        在后端的服務(wù)器上,用下面的正則去匹配所有的頁(yè)面請(qǐng)求導(dǎo)向index.html頁(yè)面。

        we must render the index.html file for any request coming with below pattern

        index.html

        <!doctype html>
        <html>
        <head>
         <meta charset="utf-8">
         <title>My App</title>
         <base href="/app/" rel="external nofollow" rel="external nofollow" >
         <body>
         <app-root>Loading...</app-root>
         <script type="text/javascript" src="vendor.bundle.js"></script>
         <script type="text/javascript" src="main.bundle.js"></script>
         </body>
        </html>

        3.3 前端路由優(yōu)缺點(diǎn)

        優(yōu)點(diǎn):

        1.從性能和用戶體驗(yàn)的層面來(lái)比較的話,后端路由每次訪問(wèn)一個(gè)新頁(yè)面的時(shí)候都要向服務(wù)器發(fā)送請(qǐng)求,然后服務(wù)器再響應(yīng)請(qǐng)求,這個(gè)過(guò)程肯定會(huì)有延遲。而前端路由在訪問(wèn)一個(gè)新頁(yè)面的時(shí)候僅僅是變換了一下路徑而已,沒(méi)有了網(wǎng)絡(luò)延遲,對(duì)于用戶體驗(yàn)來(lái)說(shuō)會(huì)有相當(dāng)大的提升。

        2.在某些場(chǎng)合中,用ajax請(qǐng)求,可以讓頁(yè)面無(wú)刷新,頁(yè)面變了但Url沒(méi)有變化,用戶不能獲取到想要的url地址,用前端路由做單頁(yè)面網(wǎng)頁(yè)就很好的解決了這個(gè)問(wèn)題。

        缺點(diǎn):

        使用瀏覽器的前進(jìn),后退鍵的時(shí)候會(huì)重新發(fā)送請(qǐng)求,沒(méi)有合理地利用緩存。

        總結(jié)

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Angular2+如何去除url中的#號(hào)詳解

        Angular2+如何去除url中的#號(hào)詳解:前言 本文中主要介紹了關(guān)于Angular2+中去除url中#號(hào)的相關(guān)內(nèi)容,這是最近在工作中遇到的一個(gè)問(wèn)題,覺(jué)著有必要給大家分享下,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。 1. 為什么要去除? Angular官方指出:如果沒(méi)有足夠使用hash風(fēng)格(#)的理由,還是盡
        推薦度:
        標(biāo)簽: url #號(hào) angu
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲1区1区3区4区产品乱码芒果 | 亚洲情a成黄在线观看| 亚洲www在线观看| 成人黄色免费网站| 亚洲国产精品日韩在线| 色影音免费色资源| 亚洲精品不卡视频| aⅴ在线免费观看| 亚洲国产精品久久久久秋霞影院| 伊人久久免费视频| 亚洲精品成人图区| 成人免费无码大片a毛片软件| 亚洲 日韩 色 图网站| 破了亲妺妺的处免费视频国产 | 最近免费mv在线观看动漫 | 久久夜色精品国产噜噜噜亚洲AV| 久久久久免费看黄a级试看| 西西人体44rt高清亚洲| 免费91麻豆精品国产自产在线观看| 亚洲av无码一区二区三区不卡 | 亚洲伊人久久大香线蕉影院| 四虎免费影院ww4164h| 99亚偷拍自图区亚洲| 日本a级片免费看| 免费国产va视频永久在线观看| 国产亚洲精品无码拍拍拍色欲 | 亚洲AV日韩AV无码污污网站| 全亚洲最新黄色特级网站 | 最近免费中文字幕中文高清| 亚洲国产精品嫩草影院在线观看| 一级成人a毛片免费播放| 亚洲一卡2卡4卡5卡6卡在线99 | 日本免费电影一区| 色www永久免费| 麻豆狠色伊人亚洲综合网站| 成人永久福利免费观看| 国产无遮挡又黄又爽免费网站| 亚洲免费二区三区| 亚洲区小说区图片区| 99久久99久久免费精品小说| 亚洲乱亚洲乱妇24p|