成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于 Webpack 3 的 Vue.js 工程項目腳手架

開發 開發工具
隨著項目復雜度與體量的增加,我們發現初始化編譯與增量編譯的速度都有所下降,為了提升構建性能首先我們要做的就是保持 Webpack 版本的更新速度;此外,create-webpack-app 還默認啟動了 DllPlugin 在開發狀態下將所有的依賴提取為 dll 文件以提高增量編譯的速度。

基于 Webpack 3 的 Vue.js 工程項目腳手架從屬于筆者的 Web 前端入門與工程實踐,是筆者基于兄弟項目 React 腳手架改造而來,二者在 Webpack 配置層面差異不大。更多關于 Vue.js 或者前端開發相關的資料鏈接可以參考Vue.js 學習與實踐資料索引Vue.js 與前端工程化實踐系列文章以及 Webpack 學習與資料索引,對于其中淺薄的工程化的思考可以參考 2016-我的前端之路:工具化與工程化。

基于 Webpack 3 的 Vue.js 工程項目腳手架

create-webpack-app是筆者對于日常工作中的基于 React/Vue.js 技術棧與實踐的沉淀,dev-config/* 與 package.json 構成了基礎的腳手架,支持最新的開發流程與默認的生產環境優化;模板項目包含特性如下:

  • 技術棧支持:使用 ES6/ES7 語法、允許使用 CSS Modules、SCSS、Less 并且使用 PostCSS 進行自動 Polyfill、支持使用 styled-component 進行 CSS-in-JS 樣式控制、使用 Flow 作為靜態類型檢測工具、使用 Jest 作為默認的測試框架
  • 開發環境:使用 WebpackDevServer 部署開發服務器、使用 React Hot Loader 進行組件熱加載、使用 Babel 進行代碼轉換、使用 ESLint 進行代碼檢測、使用 DllPlugin 作為開發環境下公共代碼提取工具以優化編譯速度
  • 生產環境:使用 CommonChunksPlugin 作為生產環境下公共代碼提取工具、使用 Prepack & prepack-webpack-plugin 進行代碼優化、使用 offline-plugin 添加簡單的 PWA 特性增強
  • 部署方式:支持獨立部署(Hash 方式切換路由)、支持服務端部署、支持服務端渲染

本部分即是針對 Vue.js 項目的腳手架,我們可以直接拷貝該項目來展示部分開發模式或者作為模板項目使用:

  1. # 下載本項目 
  2. git clone https://github.com/wxyyxc1992/create-webpack-app 
  3.  
  4. # 可以使用 yarn install & npm start 直接運行本項目 
  5. # 僅保留 dev-config、package.json、src/client.js、src/ssr_server.js 
  6. mkdir /path/to/your/project 
  7.  
  8. # 拷貝必須的啟動文件 
  9. cp -r vue/dev-config/ /path/to/your/project 
  10. cp vue/package.json /path/to/your/project 
  11. cp vue/src/client.js /path/to/your/project/src/ 
  12.  
  13. # 安裝運行依賴 
  14. cd /path/to/your/project 
  15.  
  16. yarn install / npm install 
  17.  
  18. # 有時候需要安裝 better-npm-run 
  19. npm install better-npm-run -g 
  20.  
  21. # 啟動項目 
  22. npm start 
  23.  
  24. # 編譯為純客戶端部署模式,即單個 HTML 頁面 
  25. npm run build 
  26.  
  27. # 進行依賴升級檢查 
  28. npm run update 
  • 開發環境下的操作面板:

  • 編譯之后的包體分析:

本模板相較于官方的 webpack-simple 功能稍微復雜,并且引入了完整的 Flow、Jest 等技術棧配置,同時優化了 Webpack 的構建性能。

!Important! 項目尚未支持 SSR

基礎配置

create-webpack-app 默認的應用配置位于 dev-config/apps.config.js 文件中,該文件也是 dev-config/ 文件夾下唯一與應用業務相關的文件;該文件定義了不同應用中的需要配置的應用相關信息。create-webpack-app 定位為單項目多應用的模板,因此我們可以在apps 鍵下配置項目設計的應用入口;在打包時會自動將多個應用并行編譯并且提取出所有公共的代碼。每個應用需要提供唯一編號、入口文件地址、模板頁面、是否編譯等信息;接下來 devServer 則是定義了當前正在開發的應用入口,ssrServer 定義了打包時需要使用的渲染服務器入口,其會在執行 npm run build:ssr 時調用,proxy 與 api 則定義了后端服務器信息,開發者可以根據業務需求自行使用。典型的 apps.config.js 文件配置如下:

  1. module.exports = { 
  2.   //基本的應用配置信息 
  3.   apps: [ 
  4.     //HelloWorld 
  5.     { 
  6.       id: "pwa"
  7.       src: "./pwa/client.js"
  8.       indexPage: defaultIndexPage, 
  9.       compiled: true 
  10.     } 
  11.   ], 
  12.  
  13.   //開發入口配置 
  14.   devServer: { 
  15.     appEntrySrc: "./pwa/client.js", //當前待調試的APP的入口文件 
  16.     port: 3000 //監聽的Server端口 
  17.   }, 
  18.  
  19.   //用于服務端渲染的Server路徑 
  20.   ssrServer: { 
  21.     serverEntrySrc: "./pwa/ssr_server.js" 
  22.   }, 
  23.  
  24.   //依賴項配置 
  25.   proxy: { 
  26.     //后端服務器地址 http://your.backend/ 
  27.     "/api/*""http://localhost:3001" 
  28.   }, 
  29.  
  30.   //后端 api 配置,這樣配置可以避免將測試服務器端口暴露出去 
  31.   api: { 
  32.     dev: {}, 
  33.     prod: {} 
  34.   } 
  35. }; 

應用入口文件則遵循官方的單文件組件范式:

  1. import Vue from 'vue'
  2. import App from './application/App.vue'
  3.  
  4. new Vue({ 
  5.   el: '#root'
  6.   render: h => h(App) 
  7. }); 

腳本編譯與熱加載

在 dev-config/webpack/loaders.js 文件中定義了模板所需要的加載器,默認支持 js、jsx、vue、ts、tsx、css、scss、less、json 以及各種資源文件等常見格式。當我們執行 npm start 命令時,會自動啟動dev-config/server/devServer.js 文件中定義的 Webpack 開發服務器,該服務器會使用 dev-config/webpack.config.js 文件進行配置項生成。值得一提的是,WebpackDevServer 中的 contentBase 設置為了 path.join(__dirname, "../../public"),也就是將 /public 目錄作為開發服務器的默認根目錄。熱加載配置包括以下步驟:

  • 開發時應用入口設置:
  1. entry = [ 
  2.    `webpack-dev-server/client?http://0.0.0.0:${appsConfig.devServer.port}`, 
  3.    "webpack/hot/only-dev-server"
  4.    require("./apps.config.js").devServer.appEntrySrc 
  5.  ]; 
  • Babel 配置,默認的 Babel 文件位于 dev-config/tool/.babelrc:
  1. ... 
  2.   "plugins": [ 
  3.   ... 

樣式處理

create-webpack-app 支持 SCSS、CSS Modules 以及 styled-components 這三種樣式定義方式。

Webpack 性能優化

公共代碼分割

create-webpack-app 使用了 CommonsChunkPlugin 進行代碼分割,默認在 dev-config/webpack/plugins.js 文件中定義了對于 node_modules 中依賴文件的自動抽取:

  1. new webpack.optimize.CommonsChunkPlugin({ 
  2.     name"vendor"
  3.     filename: "vendor.bundle.js"
  4.     minChunks: ({ resource }) => 
  5.       resource && 
  6.       resource.indexOf("node_modules") >= 0 && 
  7.       resource.match(/\.(js|less|scss)$/) 
  8.   }) 

該插件會自動生成 vendor.bundle.js 文件,我們需要在應用入口文件之前引用它;開發者也可以自定義 CommonsChunkPlugin 插件以自定義需要提取的公共代碼。

構建性能優化

隨著項目復雜度與體量的增加,我們發現初始化編譯與增量編譯的速度都有所下降,為了提升構建性能首先我們要做的就是保持 Webpack 版本的更新速度;此外,create-webpack-app 還默認啟動了 DllPlugin 在開發狀態下將所有的依賴提取為 dll 文件以提高增量編譯的速度。因為考慮到靈活性,即隨時有可能增減依賴的情況,create-webpack-app 目前設置的是每次使用 npm start 的時候都會重新生成 dll 文件;如果是已經穩定的項目可以考慮僅生成一次依賴。

  1. const path = require("path"); 
  2. const pkg = require("../package.json"); 
  3. const webpack = require("webpack"); 
  4.  
  5. let dllConfig = { 
  6.   name"vendor"
  7.   entry: Object.keys(pkg.dependencies), 
  8.   output: { 
  9.     path: path.resolve(__dirname, "../public/dll"), 
  10.     filename: "vendor.bundle.js"
  11.     library: "vendor_[hash]" 
  12.   }, 
  13.   plugins: [ 
  14.     new webpack.DllPlugin({ 
  15.       name"vendor_[hash]"
  16.       path: path.resolve(__dirname, "../public/dll/manifest.json"
  17.     }) 
  18.   ] 
  19. }; 
  20.  
  21. module.exports = dllConfig; 
  22.  
  23. // 在 public/index.html 文件中需要引入該依賴 
  24. // index.html 
  25. <script src="dll/vendor.bundle.js"></script> 

代碼編譯優化

create-webpack-app 中也內置了其他的編譯之后的代碼性能優化插件,首先是利用 Webpack 3 的 Scope Hositing 特性來優化生成的模塊;這一點需要使用 ModuleConcatenationPlugin 插件。此外,還使用了 PrepackWebpackPlugin 對于打包生成的文件進行過濾與重構;不過需要注意的是 PrepackWebpackPlugin 會較大地降低編譯速度,因此也是可以根據實際的項目情況選用。

  1. // 使用 Scope Hositing 特性 
  2.  new webpack.optimize.ModuleConcatenationPlugin(), 
  3.  
  4.  // 使用 Prepack 優化包體大小 
  5.  // 暫時存在 Bug,等待修復 
  6.  // 使用前 21 - 425 
  7.  // 使用后 21 - 433 
  8.  new PrepackWebpackPlugin({ 
  9.    mathRandomSeed: "0" 
  10.  }), 

PWA

create-webpack-app 中只是簡單地使用了 Offline Plugin,其配置如下:

  1. // webpack.config.js example 
  2.  
  3. var OfflinePlugin = require('offline-plugin'); 
  4.  
  5. module.exports = { 
  6.   // ... 
  7.  
  8.   plugins: [ 
  9.     // ... other plugins 
  10.     // it's always better if OfflinePlugin is the last plugin added 
  11.     new OfflinePlugin() 
  12.   ] 
  13.   // ... 
  14.  
  15. // render.js 
  16. require('offline-plugin/runtime').install(); 

觀察網絡面板中的資源請求情況,我們可以看到腳本等已經被緩存在了本地:

設計模式

JavaScript 優先

本小節僅代表本人個人意見,請多多指點

官方文檔中介紹的單文件組件(Single File Component)包含了 template、script、style 這三個部分,筆者感覺算是典型的前端項目三要素。不過筆者習慣的開發模式是以 JavaScript 為中心,即 JavaScript 文件單獨可測試,而不是和樣式以及標簽混合在一起(JSX 本質上也是 JavaScript)。因此在該模板中,筆者是將標簽、樣式與腳本分到了三個文件中:

  1. // App.js 
  2. // @flow 
  3.  
  4. export default { 
  5.   name"app"
  6.   data() { 
  7.     return { 
  8.       msg: "Vue.js & Webpack App Boilerplate by 王下邀月熊" 
  9.     }; 
  10.   } 
  11. }; 
  12.  
  13. // App.scss 
  14. #app { 
  15.   font-family: 'Avenir', Helvetica, Arial, sans-serif; 
  16.   -webkit-font-smoothing: antialiased; 
  17.   -moz-osx-font-smoothing: grayscale; 
  18.   text-align: center; 
  19.   color: #2c3e50; 
  20.   margin-top: 60px; 
  21.  
  22. h1, h2 { 
  23.   font-weight: normal; 
  24.  
  25. ul { 
  26.   list-style-type: none; 
  27.   padding: 0; 
  28.  
  29. li { 
  30.   display: inline-block; 
  31.   margin: 0 10px; 
  32.  
  33. a { 
  34.   color: #42b983; 
  35.  
  36. // App.vue 
  37. <template> 
  38.     <div id="app"
  39.         <img src="../../public/assets/logo.png"
  40.         <h1>{{ msg }}</h1> 
  41.         <h2>Essential Links</h2> 
  42.         <ul> 
  43.             <li><a href="https://vuejs.org" target="_blank">Core Docs</a></li> 
  44.             <li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li> 
  45.             <li><a href="https://gitter.im/vuejs/vue" target="_blank">Gitter Chat</a></li> 
  46.             <li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li> 
  47.         </ul> 
  48.         <h2>Ecosystem</h2> 
  49.         <ul> 
  50.             <li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li> 
  51.             <li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li> 
  52.             <li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li> 
  53.             <li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li> 
  54.         </ul> 
  55.     </div> 
  56. </template> 
  57.  
  58. <script> 
  59.   import App from './App.js'
  60.   export default App; 
  61. </script> 
  62.  
  63. <style lang="scss"
  64.     @import "App"
  65. </style> 

筆者個人感覺這種模式更符合單一職責原則,對于復雜的組件能夠提高代碼可讀性;同時將 JavaScript 代碼獨立出來也能更加方便地進行單元測試與類型檢測等操作。

代碼風格

詳細的 JavaScript 編程樣式指南已經遷移到了 Web 項目開發風格指南JavaScript 編程樣式指南,涵蓋了基本原則闡述、代碼風格、代碼格式化與語法檢測、項目架構等幾個部分。不過本部分建議是類似于 Create React APP 配置提交時自動進行格式化,首先需要安裝如下依賴:

  1. npm install --save husky lint-staged prettier  
  2. // or 
  3. yarn add husky lint-staged prettier 

然后在 package.json 中添加 Hook:

  1. "scripts": { 
  2.    "precommit""lint-staged"
  3.    ... 

同時添加 lint-staged 配置:

  1.   "dependencies": { 
  2.     // ... 
  3.   }, 
  4. "lint-staged": { 
  5. +   "{src,stories}/**/*.{js,jsx,json,css}": [ 
  6. +     "prettier --single-quote --write"
  7. +     "git add" 
  8. +   ] 
  9. + }, 
  10.   "scripts": { 

這樣當我們提交代碼時就會自動使用 Prettier 優化代碼,不過需要注意的是這種配置僅作用于根目錄下;如果某個倉庫中包含了多個應用配置,那么我們還需要在根目錄下單獨配置腳本。我們也可以使用 ./node_modules/.bin/prettier --single-quote --write "src/**/*.{js,jsx}" 來手動進行項目文件的格式化。另外因為模板項目時放置在了子文件下,如果使用者希望使用該特性需要手動地在 package.json 中添加 "precommit": "lint-staged" 這個配置。

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-10-08 06:10:43

前端技術Vue

2025-05-26 08:45:00

AvueVue.js前端

2018-05-15 09:10:27

前端vue.jswebpack

2022-04-24 11:33:47

代碼管理工程

2021-08-30 06:59:06

StrviewAppStrview.js項目

2022-12-12 08:56:45

Vite3Vite

2016-09-07 15:35:06

VueReact腳手架

2021-12-23 10:35:32

SpringCloud腳手架架構

2021-01-07 05:34:07

腳手架JDK緩存

2018-06-11 14:39:57

前端腳手架工具node.js

2018-08-30 16:08:37

Node.js腳手架工具

2014-08-15 09:36:06

2021-11-08 09:35:09

Vue代碼前端

2020-05-19 10:13:45

Java開發代碼

2025-05-16 07:24:41

Springkafka腳手架

2021-04-25 05:31:33

React.js項目FastReactAp

2023-04-27 08:23:38

JavaScriptVue.jsMVVC

2022-07-11 10:38:06

TienChin項目動態

2021-04-28 16:10:48

開發腳手架 Spring

2021-05-21 05:22:52

腳手架工具項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品美女久久久久久免费 | 亚洲a视频| 日本在线免费看最新的电影 | 国产精品美女视频 | 日韩毛片中文字幕 | 国产一区二区成人 | www.国产精品| 97精品超碰一区二区三区 | 色片在线观看 | 欧美精品一区二区在线观看 | 亚洲97| 国产内谢| 色婷婷综合久久久中字幕精品久久 | 亚洲一区二区三区四区五区中文 | 欧美成年网站 | 免费一区二区三区 | 免费一区二区三区 | 国产精品日韩在线观看 | 久久久久国产精品一区二区 | 久久天天 | 韩日视频在线观看 | 一级免费看 | 一区二区三区欧美 | 日韩在线精品视频 | 在线观看成人小视频 | 日韩欧美视频 | 欧美婷婷 | 一区二区视频免费观看 | 91精品国产乱码久久久久久久久 | 日韩精品一区二区三区四区 | 国产亚洲一区二区三区 | 久久久精品综合 | 亚洲精品第一国产综合野 | 成人毛片视频在线播放 | 精品国产乱码一区二区三 | 欧美在线观看一区 | 亚洲免费精品 | 99热首页| 一区二区三区四区国产精品 | 国产三级精品视频 | 91精品国产91久久久久久吃药 |