基于webpack的PC端和mobile端開發以及生產環境的搭建

我們用webpack做單頁面應用開發應該嘗試過很多次了,如果在同一個項目需要支持PC端和移動端,做成多頁面應用,開發時能根據請求的終端返回不同的內容,應該怎么做呢?以下描述的是我嘗試的一種方案,并且以vue-cli 2.x提供的模板為例,訪問 Github 可查看本項目源碼。

目錄架構

因為是PC端和移動端兩個模塊,所以我們可以在src下拆分為pcmobile兩個目錄,分別放兩端的代碼,再有一個common目錄放置常量、數據層、api層等公共資源和可復用代碼:


├── build
│ ├── webpack.config.base.js
│ ├── webpack.config.dev.js
│ └── webpack.config.prod.js
├── src
│   ├──common
│   │   ├── assets
│   │   ├── constants
│   │   ├── store
│   │   │  └── index.js
│   │   |── api
│   │   │  └── index.js
│   ├── pc
│   │   |── pages
│   │   │  |── Home.vue
│   │   │  └── About.vue
│   │   |── App.vue
│   │   |── index.html
│   │   └── main.js
│   ├── mobile
│   │   │  |── Home.vue
│   │   │  └── About.vue
│   │   |── App.vue
│   │   |── index.html
│   │   └── main.js
復制代碼

webpack配置

因為有PC端和移動端,所有開發環境下應該有兩個entry,分別為src/pc/main.jssrc/mobile/main.js,參考webpack文檔的多入口配置,所以我們在webpack.config.base.js可做如下修改:

  entry: {app: './src/pc/main.js',mobile: './src/mobile/main.js',},
復制代碼

完成以上修改后,我們分別對開發環境和打包環境作配置。

開發環境配置

在這里我們要做的是,可以讓webpack既可以同時根據PC端和mobile端的模版生成對應的html并注入打包后的js文件,這個時候我們要借助HtmlWebpackPlugin這個插件幫我們實現。所以,在webpack.config.dev.jsplugins里面,我們作以下配置:

  plugins: [// ....// PC端new HtmlWebpackPlugin({filename: 'index.html', // 最后生成的文件名template: 'src/pc/index.html', // 模版htmlchunks: ['manifest', 'vendor', 'app'], // 注入打包后的js文件inject: true,}),// 移動端new HtmlWebpackPlugin({filename: 'index.mobile.html',template:'src/mobile/index.html',chunks: ['manifest', 'vendor', 'mobile'],inject: true,}),// ....],
復制代碼

上面的配置要特別說明下的是chunks字段。webpack經過打包后一般會生成vendor.js,manifest.js,app.jsvendor.js一般是公共代碼,manifest.js是與webpack加載代碼有關的包。app.js一般是你寫的業務代碼,要注意的是,你配置了多少個入口文件,就會生成多少個這樣的包,比如我們現在有兩個入口文件,分別是appmobile,那么就會生成app.jsmobile.js

上面的配置了兩個HtmlWebpackPlugin,分別代表PC端和移動端的模板,他們chunks字段也表明了在他們生成的html里分別注入app.jsmobile.js

接下來我們想在開發時,想根據訪問的客戶端,決定加載的是PC端模版還是mobile端模板。比如在chrome瀏覽器直接打開時,我們就加載PC端模版index.html,如果我們打開了 chrome devtools,切換到移動端調試工具,那么刷新之后我們加載移動端的模版index.mobile.html,這個時候我們就可以借助webpack-dev-server工具了。

我們在webpack環境下開發,都會用到這個工具,無論是vue的腳手架vue-cli還是react的腳手架create-react-app都自帶了這個工具。腳手架就是利用這個工具來啟動本地服務的,其實webpack-dev-server內部使用了一個中間件叫做webpack-dev-middleware來啟動web服務。

只要我們在webpack中配置devServer這個屬性,就能使用了webpack-dev-server了。我們作如下配置(如果是vue-cli創建的項目,則在config/index.js里作相應配置):

  devServer: {proxy: {'/': {target: 'http://localhost:8080', // 你項目的本地服務地址bypass: function(req, res, proxyOptions) {const userAgent = req.headers['user-agent'];if (req.headers.accept.indexOf('html') !== -1) {// 根據訪問終端返回模板if (/mobile/i.test(userAgent) && !/iPad/i.test(userAgent)) {return '/index.mobile.html';}return '/index.html';}},},},}
復制代碼

這里我們代理了/的每個請求,如果用戶的請求資源類型不是html,那么就然后根據用戶的user-agent返回不同的模板。

這里要說一下的是bypass函數,官方文檔介紹如下:

webpack.js.org/configurati…

Sometimes you don't want to proxy everything. It is possible to bypass the proxy based on the return value of a function.

In the function you get access to the request, response and proxy options. It must return either false or a path that will be served instead of continuing to proxy the request.

E.g. for a browser request, you want to serve a HTML page, but for an API request you want to proxy it.

這段文字的大意是,有時候對于瀏覽器的某些請求,你希望提供HTML頁面,你可設置bypass函數,在函數里你可以拿到reqresproxy的引用, 最后必須返回false或資源提供的路徑,使這個請求不再繼續代理請求。

經過上面配置之后,我們的開發就相對方便些了,只要我們在chrome devtools切換環境并刷新,webpack就會自動返回對應的模板。

注意:如果直接訪問http://localhost:8080是無法按照客戶端的user-agent返回任務東西的(不經過bypass函數),必須在后面加多一個路徑才行,比如http://localhost:8080/path,這個問題有待解決。

生產環境配置

生產環境要配置的不多,只要配置HtmlWebpackPlugin就可以了

  plugins: [// ....// PC端模版new HtmlWebpackPlugin({filename: path.resolve(__dirname, '../dist/index.html'),template: 'src/pc/index.html',inject: true,minify: {removeComments: true,collapseWhitespace: true,removeAttributeQuotes: true,},chunksSortMode: 'dependency',chunks: ['manifest', 'vendor', 'app'],}),// 移動端模版new HtmlWebpackPlugin({filename: path.resolve(__dirname, '../dist/mobile_index.html'),template: 'src/mobile/index.html',inject: true,minify: {removeComments: true,collapseWhitespace: true,removeAttributeQuotes: true,},chunksSortMode: 'dependency',chunks: ['manifest', 'vendor', 'mobile'],}),// ....],
復制代碼

經過配置就會生成文件了,但是有一個問題是,vendor.js會包含PC端和移動端的代碼,可能有一些代碼其中由一方是用不上的,比如UI框架,我的解決辦法是在模版手動注入vue/react包和對應的UI框架,這種方法還有一個好處是減少vendor包的大小。。。

最后再貼一下項目 github 地址,歡迎star~

本文鏈接:www.zzfweb.cn/post/webpac…

轉載于:https://juejin.im/post/5c0fbcd8f265da611036e669

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252824.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習簡介(一)——卷積神經網絡

本文的主要目的,是簡單介紹時下流行的深度學習算法的基礎知識,本人也看過許多其他教程,感覺其中大部分講的還是太過深奧,于是便有了寫一篇科普文的想法。博主也是現學現賣,文中如有不當之處,請各位指出&…

node+mongoose使用例子

https://github.com/Aquarius1993/nodeNotes 功能 1. 注冊 2. 登錄 3. 修改密碼 4. 修改頭像 5. 獲取用戶筆記 6. 添加,刪除,更新筆記安裝部署 1. 安裝 Node.js MongoDB 2. npm install 3. 啟動 MongoDB 4. npm start 5. visit http://localhost:8899 https://git…

FastJson的常用操作

轉載:https://www.cnblogs.com/Ming8006/p/6944954.html 常用操作包括以下內容: 對象與(JsonObject或JsonArray)與String的互換String轉換為(JsonObject或JsonArray)如何保持順序Eval的使用值為null的&…

Jenkins持續集成 之 Jenkins安裝

一、安裝JDK與TOMCAT8 參考地址: http://ibm.chick.blog.163.com/blog/static/144201610201652811537410/ 二、下載Jenkins安裝包 wget http://mirrors.jenkins.io/war/latest/jenkins.war 三、把jenkins.war放到TOMCAT下的webapps 四、啟動tomcat并訪問 http://10.…

夜視模式,多少猥瑣相機假汝之名

一般相機加裝一個紅外濾光片,就是一個可以用來干猥瑣事情的相機了。現在有相機直接把這個功能整合了,它的這個功能叫紅外夜視模式,可以拍下黑暗中的物體,當然,也可以透視紡織品和一些其他材質的衣物。這部相機具有500萬…

vue-router.esm.js?fe87:16 [vue-router] Route with name 'page' does not exist

本文地址&#xff1a;http://www.cnblogs.com/veinyin/p/7910525.html 我的路由配置 1 { 2 path: /page, 3 name: page, 4 component: page 5 } 我的 router-link <router-link :to"{name:page,params:{trans:ahahahaha}}">page</route…

Java中設計模式之單例設計模式-1

單例作用 1 節省內存2 可以避免多種狀態導致狀態沖突單例的創建步驟 1 私有化構造方法2 私有化聲明的屬性3 getInstance4 方法需要靜態單例分類 1.懶漢式 2.餓漢式 兩種單例區別&#xff1a; 餓漢式 線程安全的 懶漢式 線程不安全的 餓漢式&#xff1a; package 設計模式之單…

Vue 父子組件間的通信

前言 在 Vue 項目中父子組件的通信是非常常見的&#xff0c;最近做項目的時候發現對這方面的知識還不怎么熟練&#xff0c;在這邊做一下筆記&#xff0c;系統學習一下吧。 1 父組件傳值給子組件 1.1 傳值寫法 父組件傳值給子組件&#xff0c;這個就比較常見了&#xff0c;直接用…

夜視儀

國民兵所用F-16的駕駛艙&#xff0c;機員配有夜視鏡以備觀察領空的客機或飛行物體使用夜視鏡時看到的影像夜視儀〈night vision device&#xff0c;簡稱NVD〉&#xff0c;也稱夜視鏡&#xff0c;是透過光學科技強化黑暗中光源的科技裝置&#xff0c;通常用于軍事用途。目前在民…

【物理/數學】—— 概念的理解 moment、momentum

moment&#xff1a;矩&#xff0c;momentum&#xff1a;[物] 動量&#xff1b;動力&#xff1b;沖力&#xff1b; 數學意義上的 moment&#xff08;矩&#xff09;概念其實源自于物理范疇。首先我們來介紹物理學意義上的矩&#xff08;Momentum&#xff09;的概念。 1. 物理學意…

JAVA多線程實現的三種方式

JAVA多線程實現方式主要有三種&#xff1a;繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。 其中前兩種方式線程執行完后都沒有返回值&#xff0c;只有最后一種是帶返回值的。 前兩種省略&#xff0c;著重看看第三種&#xff…

2springboot:快速創建springboot項目

使用IDEA快速創建springboot項目流程&#xff1a; 創建新的項目選擇 項目的命名以及包名 需要什么包就導入什么包 進行測試的單元 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>&…

如何做好渠道銷售?

作者&#xff1a;路人李志強鏈接&#xff1a;https://www.zhihu.com/question/19689177/answer/28508799來源&#xff1a;知乎著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。作為一名一線品牌的渠道銷售&#xff0c;如何讓代理商放棄其他小品…

2017浙江省賽 B - Problem Preparation ZOJ - 3959

地址&#xff1a;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3959 題目&#xff1a; Its time to prepare the problems for the 14th Zhejiang Provincial Collegiate Programming Contest! Almost all members of Zhejiang University programming conte…

jQuery導入代碼片段并綁定事件

a.html <div><button class"button" >點我達</button> </div> b.html <html> <head><script type"text/javascript" src"./js/jquery-1.0.1.js"></script><meta http-equiv"Content-Ty…

驗證碼識別

基于Keras&#xff0c;識別簡單的4位字符的驗證碼。 https://github.com/ypwhs/captcha_break

LinCode落單的數

easy 落單的數 查看執行結果 60% 通過給出2*n 1 個的數字&#xff0c;除當中一個數字之外其它每一個數字均出現兩次。找到這個數字。 您在真實的面試中是否遇到過這個題&#xff1f; Yes例子 給出 [1,2,2,1,3,4,3]。返回 4 挑戰 一次遍歷&#xff0c;常數級的額外空間復雜度…

漢邦高科范俊峰:關于透霧攝像機那點事

慧聰安防網訊 生活在北方的人們&#xff0c;隔三差五就和霧霾來一次親密接觸&#xff0c;霧霾對人們的出行和交通有很大的影響&#xff0c;霧霾籠罩之下&#xff0c;人們出行如果闖紅燈、車輛違規行駛發生交通事故&#xff0c;交通監控攝像頭只能“霧里看花”&#xff0c;透霧攝…

SpringBoot注解大全(轉)

原文鏈接&#xff1a;[springBoot系列]--springBoot注解大全 一、注解(annotations)列表 SpringBootApplication&#xff1a;包含了ComponentScan、Configuration和EnableAutoConfiguration注解。其中ComponentScan讓spring Boot掃描到Configuration類并把它加入到程序上下文。…

祭奠我的2018

提前寫這篇文章&#xff0c;是因為深深的感覺到自己的無能 18年伊始&#xff0c;在浪潮干了大半年的我 還沉醉在深深的滿足感中&#xff0c;感覺自己對工作游刃有余 那種自大和自我滿足感充斥著我的心態 已經變得不會學習了 后來有一次機遇&#xff0c;讓我有了跳出舒適的機會 …