webpack --- 發布環境的配置 代碼壓縮 代碼分類

說明

  • 源代碼
  • 本篇主要對發布環境的配置說明
  • 前面2點是對webpack的一個復習.
  • 第3點開始,逐步配置部署代碼

1. Webpack發布的策略

2.1 在實際開發中,一般會有兩套方案:

  • 開發期間的項目:包含了測試文件、測試數據、開發工具、測試工具等相關配置,有利于項目的開發和測試,但是這些文件僅用于開發,發布項目的時候需要刪除
  • 部署期間的項目,剔除了那些客戶用不到的測試數據、測試工具和文件,比較純凈,減少了項目發布后的體積,有利于開發和部署

2.2 生產環境的配置文件

  • 為了滿足我們的發布策略,需要新建一個配置文件,命名為webpack.publish.config.js,將webpack.config.js的配置拷貝過去,剔除一些開發配置項即可.

  • devSever節點刪掉:

  devServer: {hot: true,open: true,port: 4321}
  • plugins節點下的熱更新插件刪掉:
new webpack.HotModuleRupluComuntPlugin()

2. Webpack從0開始使用

2.1 項目初始化

: 使用的node版本是 12.10.0

2.1.1 新建項目(文件夾)webpack-senior

2.1.2 進入webpack-senior

新建下面三個:

  • 打包之后的文件夾: dist
  • 項目的源代碼: src
  • webpack的配置文件: webpack.config.js

2.1.3 初始化項目

  • npm init -y
  • 使用yarn安裝 jquery: yarn add jquery (等同于 npm i -D jquery)

2.1.4 src的初始化

  • 在其中新建如下文件和內容:
  • src/index.js
     <html><body><ul><li>這是第1個li</li><li>這是第2個li</li><li>這是第3個li</li><li>這是第4個li</li></ul></body></html>
    
    • src/main.js
    import $ from 'jquery'
    $(function(){$('li:odd').css('backgroundColor','pink');$('li:even').css('backgroundColor','marron');
    })();
    

2.1.5 配置文件的編寫

  • 上面完成了簡單的頁面和js對頁面的操作,下面寫Webpack的配置文件(webpack使用配置文件對項目進行打包構建)

  • webpack.config.js

     const path = require('path');module.exports = {entry: path.join(__dirname, './src/main.js'),output: {path: path.join(__dirname, './dist'),filename: 'bundle.js'}}
    
  • 以上代碼指明了webpack的入口和打包文件,下面需要裝2個插件來使index.html和main.js在內存中生成:
  1. yarn add webpack --dev(webpack是在開發環境中進行的,因此需要在npm中使用-S,在yarn中則變為 --dev)
  2. yarn add webpack-dev-server html-webpack-plugin --dev: 安裝在內存中生成index.html和main.js的插件,改寫webpack.config.js如下:
    const path = require('path');const htmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: path.join(__dirname, './src/main.js'),output: {path: path.join(__dirname, './dist'),filename: 'bundle.js'},plugin: [new htmlWebpackPlugin({template: path.join(__dirname, './src/index.html'),filename: 'index.html'})]}
  • 上面已經將html頁面放到了內存中,接下來配置啟動命令:package.json
   {"scripts": {"dev": "webpack-dev-server --open --port 3000 hot"}}

2.1.6 小檢測點

對上面過程進行說明:

  • 從啟動命令npm run dev說起
  • 當在命令行,輸入 npm run dev
  • 工具: webpack-cli(安裝在開發環境, yarn add webpack-cli --dev),會以命令行啟動的目錄作為當前目錄,去尋找package.json文件
  • 找到package.json文件后,會尋找"scripts"
  • 找到scripts對象后,進而找到"dev"
  • 然后運行命令webpack-dev-server --open --port 3000 --hot
  • webpack-dev-server:
    1. 每次寫完代碼手動調用webpack去打包代碼太麻煩,因此使用 webpack-dev-server來進行自動打包構建
    2. 會根據package.json中output的配置,生產一個內存中的main.js文件.

2.2 webpack中loader的配置

webpack默認只能解析.js.json文件,若想解析其他類型的文件,需要配置loader

配置loader解析.scss

  1. 在src目錄下新建目錄結構/src/css/index.scss
  2. index.scss中寫入如下:
html,
body {margin: 0;padding: 0;ul {list-style: none;padding: 0;margin: 0;}li{font-size:12px;line-height: 30px;padding-left: 10px;}.box {width: 500px;height: 230px;background: url('../images/開心.gif');background-size: cover;}
}
  1. /src/index.html中添加如下:
<div class="box"></div>
  1. 在main.js中導入index.scss:
import './css/index.scss';

此時項目肯定啟動不了,因為未配置loader的webpack不能解析.scss,下配置:

  • 解析CSS、SCSS、URL加載
  • 安裝依賴: yarn add style-loader css-loader sass-loader node-sass url-loader file-loader --dev
  // webpack.config.jsmodule.exports = {module:{rules:[{ test: /\.css$/, use: ['style-loader', 'css-loader'] },{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },{ test: /\.(png|gif|bump|jpg)$/, use: ['url-loader?limit=5000']}]}}
  • 解析ES6的高級語法
  • 安裝依賴: yarn add babel-core babel-loader babel-plugin-transform-runtime babel-preset-env babel-preset-stage-0 --dev
    // webpack.config.jsmodule.exports ={module:{rules:[{ test:/\.js$/, use:'babel-loader', exclude: /node_modules/ }]}}````````js//  .babelrc{"presets": ["env", "stage-0"],"plugins": ["transform-runtime"]}
  • Error: Cannot find module '@babel/core': 查看報錯,是因為babel-loader的版本過高,根據提示輸入yarn add babel-loader@7 --dev即可
  • Module not found: Error: Can't resolve 'scss-loader' in 'D:\L-rn\HeiMa\webpack-senior':沒有找到scss-loader模塊,打開package.json可以看到,里面有一個’sass-loader’,將webpack.config.js中的scss改為sass即可.

3. 使用Webpack打包項目

現在假設項目已經開發完畢,并且打算使用webpack將項目進行打包.

3.1 直接在命令行輸入webpack命令進行打包

  • 直接打包,生成的項目體積會很大,許多不需要的內容都會被打包在里面

3.2 優化打包

3.2.1 新建一個打包時的webpack配置文件:

  • webpack.pub.config.js

3.2. 2 新建一個打包指令:

  • package.json
  {"scripts": {"build": "webpack --config webpack.pub.config.js"}}

3.3.3 統一管理打包后的圖片

  • 將打包后的所有圖片放到dist/images中統一管理
  • 改變webpack.pub.config.js
  module.exports ={module: {rules:[{ test:/\.(png|gif|bump|jpg)$/, use: ['url-loader?limit=5000&name=images/[hash:8]-[name].[ext]']}]}}

3.3.4 清除之前的打包文件

  • 每次打包都刪除之前的dist文件
  • 安裝插件 yarn add clean-webpack-plugin --dev
  • 配置: webpack.pub.config.js
    const { CleanWebpackPlugin } = require('clean-webpack-plugin');module.exports = {plugins: [new CleanWebpackPlugin()]}
  • TypeError: cleanWebpackPlugin is not a constructor : 規則配置的時候出錯,不需要傳入參數下面是官網原話,拿出組件時,用到了結構賦值.

    By default, this plugin will remove all files inside webpack`s output.path directory,as well as all unused webpack assets after every successful rebuild

3.3.5 將自己的代碼和第三方包分離

  • webpack.pub.config.js
   const webpack = require('webpack');const WebpackPlugin = new webpack.optimize.CommonsChunkPlugin({name:'common',filename: 'common.js'});module.exports = {entry: {app: path.join(__dirname, './src/main.js'),common: ['jquery']},plugins:[WebpackPlugin]}
  • 自動優先加載第三方模塊,在加載自己的代碼.
    ?

3.3.6 將所有js文件放到js文件夾下面

  • webpack.pub.config.js
   const WebpackPlugin = new webpack.optimize.CommonsChunkPlugin({name: 'common',-  filename: 'common.js'+  filename: 'js/common.js'});module.exports = {output: {-    filename:'[name].js'+    filename:'js/[name].js'}}

3.3.7 壓縮js代碼

   // 壓縮JS代碼const UglifyJsPlugin = new webpack.optimize.UgliJsPlugin({compress:{warnings: false}});// 定義生產環境,進一步壓縮代碼const DefinePlugin = new webpack.DefinePlugin({'process.env.NODE_ENV': 'production'});module.exports = {plugins:[UglifyJsPlugin,DefinePlugin]}
&nbsp;

3.3.8 壓縮HTML代碼

  • webpack.config.js
   const HtmlPlugin = new HtmlWebpackPlugin({template: path.join(__dirname, './src/index.html'),filename: 'index.html',minify:{// 合并多余的空格collapseWhitespace: true,// 移除注釋removeComments: true,// 移出屬性上的雙引號removeAttributeQuotes: true}});
  • 更多minify參數: 官方github
    ?

3.3.9 將css代碼從js中抽離出來放在同一個文件夾下

  • 官網
  • yarn add extract-text-webpack-plugin --dev
   const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {module: {rules:[{test: /\.scss$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'sass-loader']})}]},plugins: [new ExtractTextPlugin("style.css")]}
  • 報錯Module build failed: CssSyntaxError: 注釋掉css的配置文件如下
    module.exports = {module: {rules[//      {//        test: /\.css$/,//        use: ExtractTextPlugin.extract({//          fallback: "style-loader",//          use: "css-loader"//        })//     }...]}}

3.3.10 抽離css時候,圖片路徑問題

  • 我們希望將CSS從js代碼中抽出,單獨存放在一個css文件夾下面.
  • 如果css中使用到了url屬性(如{background: url(path)}),在抽離出來后路徑會發生變化.
  • 需要在抽離后,自動添加路徑如下:
````git
{test: /\.scss$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'sass-loader'],
+   publicPath: '../'})
}
````

3.3.11 壓縮css文件

  • yarn add optimize-css-assets-webpack-plugin --dev
    const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');plugins: [new OptimizeCssAssetsPlugin()]
  • TypeError: Cannot read property 'compilation' of undefined: 版本問題: yarn add optimize-css-assets-webpack-plugin@3.2.0 --dev

4.檢測點

4.1 webpack是如何提高開發效率的

  • 從文件中打開.html文件時,首先從磁盤上加載該文件的內容到內存中,然后在進行渲染
  • 磁盤和內存的交互,遠遠沒有內存中直接操作快
  • html-webpack-plugin : 會根據給定的模板文件,生成在內存中的主頁
  • webpack-dev-server : 會根據配置,生成一個在內存中的主入口函數
  • 優點是把能在內存中操作的部分,都放到內存中操作.缺點比較占用內存.
  • 在開發階段,可以很方便的使用第三方庫,在生產階段,可以使用一些插件將第三方庫和源代碼進行分離,并壓縮代碼

4.2 yarn和npm的命令行在使用的時候有什么區別.

  • 首先理解開發環境生產環境
  • 開發環境: 即開發過程中使用到的依賴,在npm中常常使用-D來將依賴添加到開發環境(“devDependencies”)中
  • 生產環境: 項目部署到服務器上所用到的依賴,在npm中常常使用-S來講依賴添加到生產環境(“dependencies”)中
  • 在yarn中,使用yarn add默認將包放在生產環境中,即對應npm的 -S
  • 若需要添加到開發環境中,則需要使用yarn add [packagename] --dev

4.3 webpack中loader和plugins的區別

  • 原生的webpack只能理解javascript和json文件,如果遇到如.css或.jsx這類的后綴名,是無法解析的,這個時候就需要用到loader了,而某些loader無法解析的,就用到plugins.
  • loader是在開發過程用到的插件,而plugin貫徹整個開發和項目部署

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

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

相關文章

salesforce lightning零基礎學習(三) 表達式的!(綁定表達式)與 #(非綁定表達式)

在salesforce的classic中&#xff0c;我們使用{!expresion}在前臺頁面展示信息&#xff0c;在lightning中&#xff0c;上一篇我們也提及了&#xff0c;如果展示attribute的值&#xff0c;可以使用{!v.expresion}展示信息。 lightning在component中解析動態值的時候&#xff0c;…

sqlserver學習3---sql函數

一、SQL DML 和 DDL 可以把 SQL 分為兩個部分&#xff1a;數據操作語言 (DML) 和 數據定義語言 (DDL)。 SQL (結構化查詢語言)是用于執行查詢的語法。但是 SQL 語言也包含用于更新、插入和刪除記錄的語法。 查詢和更新指令構成了 SQL 的 DML 部分&#xff1a; SELECT - 從數據庫…

JavaScript --- [學習筆記] 原型模式

說明 接JavaScript — > [學習筆記]觀察者模式 & 理解對象 & 工廠模式 & 構造函數模式上一篇構造函數模式創建的實例,不同實例的同一個方法是不相等的,為了解決這個問題.出現了原型模式 1. 原型模式 具體做法是,不在構造函數中定義對象實例的信息,而是將這些…

網絡協議各層概述

網絡協議概述 OSI是一個開放性的通信系統互連參考模型&#xff0c;他是一個定義得非常好的協議規范。OSI模型有7層結構&#xff0c;每層都可以有幾個子層。 OSI的7層從上到下分別是 7 應用層 6 表示層 5 會話層 4 傳輸層 3 網絡層 2 數據鏈路層 1 物理層&#xff1b; 其中高層&…

A start job is running for Raise network interface(5min 13s )問題解決方法

命令&#xff1a;sudo vim /etc/systemd/system/network-online.target.wants/networking.service將里面的TimeoutStartSec5min 修改為TimeoutStartSec2sec 然后重啟系統&#xff0c;就可以生效了&#xff0c;開機速度很快 轉載于:https://www.cnblogs.com/sea-stream/p/98615…

javascript --- 實現對象的深拷貝

淺拷貝和深拷貝 淺拷貝: 只拷貝一層.當對象是復雜數據類型(Object、 Array)時,只拷貝引用深拷貝: 多層拷貝.復雜數據類型,會重新分配內存空間. 實現淺拷貝的2種方法 使用for ... in 實現 var obj {name: marron,age: 18,msg: {sex: "1" } } var o {}; for(let …

Qt與FFmpeg聯合開發指南(二)——解碼(2):封裝和界面設計

與解碼相關的主要代碼在上一篇博客中已經做了介紹&#xff0c;本篇我們會先討論一下如何控制解碼速度再提供一個我個人的封裝思路。最后回歸到界面設計環節重點看一下如何保證播放器界面在縮放和拖動的過程中保證視頻畫面的寬高比例。 一、解碼速度 播放器播放媒體文件的時候播…

Bzoj1051 受歡迎的牛

每一頭牛的愿望就是變成一頭最受歡迎的牛。現在有 N 頭牛&#xff0c;給你 M 對整數 (A,B)&#xff0c;表示牛 A 認為牛 B 受歡迎。這種關系是具有傳遞性的&#xff0c;如果 A 認為 B 受歡迎&#xff0c;B 認為 C 受歡迎&#xff0c;那么牛 A 也認為牛 C 受歡迎。你的任務是求出…

node --- 模塊加載機制

1. Node.js中模塊加載機制 1.1 模塊查找規則-當模塊擁有路徑但沒有后綴時 require(./find.js); require(./find);require方法根據模塊路徑查找模塊,如果是完整路徑,直接進入模塊如果模塊后綴省略,先找同名JS文件再找同名JS文件夾 require(./find); // 以上會先找到命令行目錄…

51Nod 蜥蜴和地下室(搜索)

哈利喜歡玩角色扮演的電腦游戲《蜥蜴和地下室》。此時&#xff0c;他正在扮演一個魔術師。在最后一關&#xff0c;他必須和一排的弓箭手戰斗。他唯一能消滅他們的辦法是一個火球咒語。如果哈利用他的火球咒語攻擊第i個弓箭手&#xff08;他們從左到右標記&#xff09;&#xff…

多線程——實現Runnable接口實現一個多線程

實現Runnable接口實現一個多線程 Runnable接口源碼&#xff1a; package java.lang; //Runnable接口源碼只有一個run方法 public interface Runnable {public abstract void run(); } 實現Runnable的兩個多線程類&#xff1a; public class RunnableThread1 implements Runnabl…

javascript --- 文件上傳即時預覽 閉包實現多圖片即時預覽

使用javascript原生功能實現,點擊上傳文件,然后再網頁上顯示出來 1. 初級顯示 1.1 準備一個input標簽和一個img標簽 <input typefile id"file"> <img id"preview" src"">1.2 js代碼如下 // 將上傳的圖片顯示到頁面上function sho…

第一次作業:深入Linux源碼分析進程模型

一.進程的概念 第一&#xff0c;進程是一個實體。每一個進程都有它自己的地址空間&#xff0c;一般情況下&#xff0c;包括文本區域&#xff08;text region&#xff09;、數據區域&#xff08;data region&#xff09;和堆棧&#xff08;stack region&#xff09;。文本區域存…

關于模型驗證那點事兒

今天應笑笑老師之問&#xff0c;做了一個模型驗證的例子&#xff0c;發現之前對這個東西的理解太片面&#xff0c;重新整理了一下思路 字段驗證優先級高于類驗證 什么是類驗證呢&#xff1f;就是兩個字段組合的驗證&#xff0c;比如你Admin不允許修改密碼&#xff0c;你修改密碼…

mongoose --- createUser

說明 源代碼記錄、遺忘回顧mongoDB默認不需要使用賬號密碼即可訪問數據庫.下面是給mongoDB添加超級管理員和普通用戶的方法 以系統管理員的方式運行powershell連接數據庫 mongo查看數據庫: show dbs切換到admin數據庫: use admin創建超級管理員賬戶: db.createUser({user: roo…

Win10安裝MySQL5.7.22 解壓縮版(手動配置)方法

1.下載地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接點擊下載項 下載后&#xff1a; 2.可以把解壓的內容隨便放到一個目錄&#xff0c;我的是如下目錄&#xff08;放到C盤的話&#xff0c;可能在修改ini文件時涉及權限問題&#xff0c;之后我…

Elemant-UI日期范圍的表單驗證

Form 組件提供了表單驗證的功能&#xff0c;只需要通過 rules 屬性傳入約定的驗證規則&#xff0c;并將 Form-Item 的 prop 屬性設置為需校驗的字段名即可。但是官網的示例只有普通日期類型的驗證&#xff0c;沒有時間范圍的驗證。 一開始&#xff0c;我認為時間時間范圍的是一…

node --- [express項目] 開發環境下使用morgan控制臺輸出訪問信息

說明 源代碼記錄、遺忘回顧 process.env node中提供了一個process.env接口用于訪問計算機中的系統環境變量. 可以利用以上屬性來區分當前的環境是開發環境還是生產環境,代碼如下: if (process.env.NODE_ENV development) {console.log(當前環境是開發環境) } else {consol…

Dynamics CRM 訪問團隊的使用

訪問團隊和負責人團隊的區別是&#xff1a;負責人團隊可以擁有記錄&#xff0c;訪問團隊不能擁有記錄也不能加入解決方案中。 訪問團隊用法1&#xff1a;可以將不同組織的人員加入到訪問組實現數據的更新、刪除、共享 訪問團隊用法2&#xff1a;訪問團隊模板的使用 步驟一&…

業務邏輯

快捷支付接口規范 問題背景 持卡人身份驗證持卡人在發卡銀行提供的身份驗證服務器進行驗證&#xff0c;將結果告知商戶資金清算資金清算在身份驗證通過后進行即時清算&#xff0c;也可能是通過專用資金清算網絡進行傳統方法弊端 持卡人需要訪問很多網站才能完成一次完整支付 &a…