Webpack基礎

path.resolve

// 只要以/開頭,就變為絕對路徑
// ./和直接寫效果相同 
var path = require("path")     //引入node的path模塊path.resolve('/foo/bar', './baz')   // returns '/foo/bar/baz'
path.resolve('/foo/bar', 'baz')   // returns '/foo/bar/baz'
path.resolve('/foo/bar', '/baz')   // returns '/baz'
path.resolve('/foo/bar', '../baz')   // returns '/foo/baz'
path.resolve('home','/foo/bar', '../baz')   // returns '/foo/baz'
path.resolve('home','./foo/bar', '../baz')   // returns '當前工作目錄/home/foo/baz'
path.resolve('home','foo/bar', '../baz')   // returns '當前工作目錄/home/foo/baz'

webpack.config.js

  • 該文件若有更新,需要重啟
  • css-loader:由于import引入的樣式文件會作用在全局,若想css模塊化,則設置modules為true
  • 默認情況下,將不接受在 HTTPS 上運行且證書無效的后端服務器

Tip
請注意,要完全啟用 HMR ,需要 webpack.HotModuleReplacementPlugin。如果使用 --hot 選項啟動 webpack 或 webpack-dev-server,該插件將自動添加,因此你可能不需要將其添加到 webpack.config.js 中。

加了publicPath后打包的文件在哪?如何利用cdn

/** @Author: your name* @Date: 2021-04-18 15:44:29* @LastEditTime: 2021-08-08 17:58:22* @LastEditors: Please set LastEditors* @Description: In User Settings Edit* @FilePath: \newToDoc:\hyy\webpack\webpack.config.js*/
const path = require("path");// 設置熱更新
const webpack = require('webpack')const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin")// 處理vue文件
const VueLoaderPlugin = require('vue-loader/lib/plugin')module.exports = {mode: 'development', // 不設置的話是生產模式,代碼會壓縮成一行devtool: 'eval-source-map',// 配置sourceMap// 定位到源代碼的錯誤行數// https://webpack.docschina.org/configuration/devtool/// source-map會生成map文件,打包后文件的最后一行會顯示對應的.map文件// inline-source-map不會生成map文件,會將映射關系放在base64文件里,精確到行列(性能消耗大)// inline-cheap-source-map精確到行// inline-cheap-module-source-map檢測到第三方模塊里的錯誤// cheap-module-eval-source-map 開發環境:有提示,速度尚可,無map文件// cheap-module-source-map 有提示,速度比加eval慢,會生成.map文件entry: {// npx webpack 后面跟的入口commonjs: path.resolve(__dirname, "./src/js/commonjs.js"),es6: path.resolve(__dirname, "./src/js/es6.js"),// 完整寫法 因此輸出默認也是main.js(在沒有配置文件名時)// 若改成test: 'xxx',則默認輸出test.js// main: "./src/js/es6.js"},output: {// __dirname指的是當前文件所在文件夾的絕對路徑。path: path.resolve(__dirname + "/dist"),// 輸出的文件名默認是main.js// [name]是占位符寫法,對應entry里的keyfilename: "js/[name].js",// 產出的文件根目錄前綴,index.html引入js時會加上這個前綴// publicPath: 'http://testCdn.com'},module: {// 告訴webpack 遇到什么模塊要如何處理rules: [{test: /\.vue$/,use: ["vue-loader"]},{test: /\.(png|jpe?g|gif)$/,use: {loader: 'file-loader',// v5 版本已廢棄: 請考慮向 asset modules 遷移。// 用的loader要安裝// https://webpack.docschina.org/loaders/file-loader/// npm install file-loader --save-dev// 那么import test from './test.jpg' test就是打包后的圖片文件名(含路徑)// 還可以用url-loader:用于將文件轉換為 base64 URI 的 loader,打包后就不再產出圖片文件了// 若圖片很大且使用url-loader → base64字符串很長 → 打包后文件體積很大 → 加載時間長 這時最好用file-loader// 若圖片很小且使用file-loader → 單獨生成圖片文件 → 多發送一次HTTP請求?不會緩存嗎options: {name: '[name].[ext]',// 當打包后的文件名、擴展名和原來的一樣outputPath: 'imgs/'// 若路徑}// 這是對loader的配置}},{test: /\.(png|jpe?g|gif)$/,use: {loader: 'url-loader',options: {name: '[name].[ext]',outputPath: 'imgs/',limit: 20480,// 20kb 超出大小則會選用file-loader// 用一個url-loader就相當于url-loader + file-loader了}},},{test: /\.js$/,use: {loader: 'babel-loader',options: {// presets和plugins選其一// presets: [["@babel/preset-env", {//     useBuiltIns: 'usage',//     corejs: 3// }]],plugins: [['@babel/plugin-transform-runtime', {absuluteRuntime: false,corejs: 3,helpers: true,regenerator: true,useESMoudles: false,version: '7.0.0-beta.0'}]]}},// 排除node_modules里第三方文件的代碼exclude: path.resolve(__dirname, 'node_modules')},{test: /\.css$/,// loader執行順序:從后往前,從下往上,先css-loader再style-loader// 當css文件間有依賴時,css-loader會加以分析// style-loader會將css-loader處理后的結果,會放到html的<style></style>里// 可能會產生多個style標簽use: ["style-loader", "css-loader"]},{test: /\.scss$/,use: ["style-loader",// "css-loader",// 以下importLoaders語法表示,如果引入的index.scss文件里又引入了其他.scss文件// 也要用postcss-loader、sass-loader處理它們// 在最新版本的webpack默認有此功能了// 由于import引入的樣式文件會作用在全局,若想css模塊化,則設置modules為true// 配置后使用:import myStyles from 'XXX'// xxx.className =`${myStyles.logo}`{loader: "css-loader",options: {importLoaders: 2,// ?modules: true,}},"postcss-loader","sass-loader"]// 順序不可改動// 翻譯后的樣式代碼就不再有嵌套等瀏覽器不能識別的語法// sass-loader 需要預先安裝 Dart Sass 或 Node Sass// 我們推薦使用 Dart Sass。// npm install --save-dev postcss-loader 處理css3?// autoprefixer自動加上廠商前綴(考慮兼容問題) npm install autoprefixer -D// autoprefixer需和postcss配合使用,創建postcss.config.js配置文件},// 處理字體圖標:讓字體圖標生效{test: /\.(eot|svg|ttf|woff)/,use: ['file-loader']},{test: /\.tpl$/,loader: 'ejs-loader'},]},plugins: [// 打包后自動在dist文件夾下生成index.html// 和module同級// 用到的loader、plugin都需要npm安裝// 實例化// 會以template提供的模板為基礎生成index.html,并會引入output中指定的js文件new HtmlWebpackPlugin({filename: 'index.html',template: path.resolve(__dirname, "./src/index.html"),chunks: ['commonjs', 'es6'],excludeChunks: ['node_modules']}),// 打包前清空dist目錄new CleanWebpackPlugin(),new webpack.HotModuleReplacementPlugin(),new VueLoaderPlugin()],// devServer只存在于開發環境!!線上沒有代理// https://webpack.docschina.org/configuration/dev-server/#root// 使用前先安裝// 充當服務器的作用,啟動本地端口,訪問端口時會返回打包的html的內容devServer: {// 自動打開open: true,host: "localhost",port: 3333,// 接口地址是/Yixiantong開頭的,則轉發到xxxproxy: {'/api': {target: 'http://study.jsplusplus.com',secure: false, // 如果target是https的pathRewrite: {'^/api': ''},// 接口對源有限制changeOrigin: true}},// 開啟熱更新 1. 引入webpack 2. 配置plugins 3. hot設為truehot: true,}
};

postcss.config.js

  • 引入autoprefixer
// 參考https://webpack.docschina.org/loaders/postcss-loader/
module.exports = {plugins: [require('autoprefixer')],
};

package.json

  • 想在瀏覽器中看到postcss-loader + autoprefixer的效果(使用transform時,翻譯后自動加上廠商前綴:-webkit-transform: rotate(-45deg)
  • 配置項目針對的是市場份額大于1%,上兩個版本的瀏覽器
  "browserslist":["> 1%", "last 2 versions"]
  • dev:啟動dev server服務器
  • build:相當于npx webpack
  • dev server:只要修改了源代碼就能看到最新的結果
  • watch: 監聽代碼變化,那就不是運行在port了,而是要運行dist里的index.html
  "scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack-dev-server --config webpack.config.js","watch": "webpack --watch","build": "webpack --config webpack.config.js"},

clean-webpack-plugin插件

https://www.npmjs.com/package/clean-webpack-plugin

  • cnpm install --save-dev clean-webpack-plugin
  • 每次打包都能清空dist目錄

請求轉發

  • webpack-dev-server底層使用了http-proxy-middleware來實現功能

    https://webpack.docschina.org/configuration/dev-server/#root

不帶前綴

  • http://localhost:3333/Yixiantong/getHomeDatas轉發到接口的域名下
import axios from 'axios'
// 正式/開發環境的接口地址不同,因此使用相對路徑,而不能寫死
axios.get('/Yixiantong/getHomeDatas').then((res) => {console.log(res)
})
  • webpack.config.js
devServer: {// 自動打開open: true,host: "localhost",port: 3333,// 接口地址是/Yixiantong開頭的,則轉發到xxxproxy: {'/Yixiantong': {target: 'http://study.jsplusplus.com',// 接口對源有限制changeOrigin: true}},
}

帶前綴

axios.get('/api/Yixiantong/getHomeDatas').then((res) => {console.log(res)
})
  • webpack.config.js
devServer: {// 自動打開open: true,host: "localhost",port: 3333,// 接口地址是/Yixiantong開頭的,則轉發到xxxproxy: {'/api': {target: 'http://study.jsplusplus.com',secure: false, // 如果target是https的pathRewrite: {'^/api': ''},// 接口對源有限制changeOrigin: true}},
}

npm run dev

  • npm run dev時并沒有生成dist文件夾
  • webpack devserver會把打包生成的文件放到內存里,提高了打包效率
    在這里插入圖片描述

HMR熱更新(需要實踐驗證各場景

  • 需要兩步:配置文件 + index.js監聽
  • 開啟熱更新后,控制臺會顯示[WDS] Hot Module Replacement enabled.
  • 熱更新,源代碼修改,頁面不會刷新,瀏覽器也不會重新下載html文件,能保留原先渲染的內容、路由、表單輸入、變量等
  • style-loader內置了if(module.hot)幫助實現了熱更新,不用手動去配置
// 1. 
const webpack = require('webpack')
// 2.
plugins: [new webpack.HotModuleReplacementPlugin()
],
// 3.
devServer: {hot: true,
}

在這里插入圖片描述

  • js里的熱更新:
  • vue-loader、react babel-preset實現了熱更新
  • counter.js(入口)
import number from './number'
const count = document.createElement('div')
count.setAttribute('id', 'count')
count.innerText = 1
document.body.appendChild(count)
setInterval(() => {count.innerText = +count.innerText + 1
}, 1000);number()// 4. 監聽number模塊的變化
if (module.hot) {console.log('module', module)// accept接受監聽的范圍module.hot.accept('./number', () => {console.log('【不要清空counter,且重新執行number】')const oldNumber = document.getElementById('number')document.body.removeChild(oldNumber)number()})
}
  • number.js
function number() {console.log('【number里重新執行了】')const div = document.createElement('div')div.setAttribute('id', 'number')div.innerText = 100document.body.appendChild(div)
}export default number

babel

https://blog.csdn.net/weixin_43503511/article/details/118628148

  1. 安裝babel-loader(建立起webpack和babel的橋梁) babel-core
  2. 配置mudule → rules
  3. 安裝babel-preset-env(將ES5轉譯成ES6)
  4. 安裝babel-polyfill(補丁)
  5. babel-polyfill(轉換新的API以及一些定義在全局對象上的方法)打包體積增加
  6. core-js + regenerator 支持所有新特性→ babel-polyfill(將二者組合)
  7. 按需引入后,不需要在業務代碼中import ‘babel-polyfill’(全局引入),需要安裝core-js
  8. 使用babel-polyfill會污染全局,它在全局上添加新特性屬性
  9. babel-plugin-transform-runtime,大致意思是重命名新特性,若用戶也在全局上定義window.Promise則不會沖突 + cnpm i -S @babel/runtime-corejs3,在開發庫的時候才會用到
  10. 可以將options的內容放入babelrc文件,更加清晰
  11. preset的執行順序也是從下往上的

Babel 默認只轉換新的 JavaScript 句法(syntax),而不轉換新的
API,比如Iterator、Generator、Set、Map、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法(比如Object.assign、Array.from等)都不會轉碼。

{test: /\.js$/,use: {loader: "babel-loader",// 這里和babelrc是一樣的options: {presets: [["@babel/preset-env",{useBuiltIns: 'usage',corejs: 3}]]// 告訴polyfill只處理使用到的新特性(按需使用)}},// 排除node_modules里第三方文件的代碼exclude: path.resolve(__dirname, 'node_modules')
},

解析react jsx

  • 安裝@babel/preset-react

    https://babeljs.io/docs/en/babel-preset-react#docsNav

解析vue

  • 安裝vue-loader vue-template-compiler
  • 引入VueLoaderPlugin
const VueLoaderPlugin = require('vue-loader/lib/plugin')
rules: [{test: /\.vue$/,use: ["vue-loader"]}
]
plugins: [new VueLoaderPlugin()
],

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

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

相關文章

(php)實現萬年歷

1 <?php2 //修改頁面編碼3 header("content-type:text/html;charsetutf-8");4 5 //獲取當前年6 $year$_GET[y]?$_GET[y]:date(Y);7 8 //獲取當年月9 $month$_GET[m]?$_GET[m]:date(m); 10 11 //獲取當前月多少天 12 $daysdate(t,strtotime("{$year}-{$m…

LeetCode:二叉樹相關應用

LeetCode&#xff1a;二叉樹相關應用 基礎知識 617.歸并兩個二叉樹 題目 Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new …

ubuntu16.04 python3.5 opencv的安裝與卸載(轉載)

轉載https://blog.csdn.net/qq_37541097/article/details/79045595 Ubuntu16.04 自帶python2.7和python3.5兩個版本&#xff0c;默認為python2.7&#xff0c;我使用的是3.5&#xff0c;所以首先將默認的python版本改為3.5. 在終端輸入下列指令&#xff1a; sudo update-alterna…

Webpack進階(一) tree shaking與不同mode

Tree Shaking 生產環境去除沒有使用到的內容&#xff08;開發環境沒有刪除&#xff0c;會影響調試&#xff09;只支持ESM規范&#xff08;靜態引入&#xff0c;編譯時引入&#xff09;&#xff0c;不支持CJS&#xff08;動態引入&#xff0c;執行時引入&#xff09; // webpa…

jquery --- 網頁選項卡

點擊,不同的tab_menu,顯示不同的tab_box 注意點: 1.獲取ul下,當前li的編號. $(‘div ul li’).index(this) 2.顯示ul下編號為$index的li -> $(‘ul li’).eq($index) <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <style&g…

Webpack進階(二)代碼分割 Code Splitting

源代碼index.js里包含2部分① 業務邏輯代碼 1mb② 引入&#xff08;如lodash包&#xff09;的代碼 1mb若更新了業務邏輯代碼&#xff0c;但在瀏覽器運行時每次都下載2mb的index.js顯然不合理&#xff0c;第三方包是不會變的 手動拆分 webpack.base.js entry: {main: path.re…

5177. 【NOIP2017提高組模擬6.28】TRAVEL (Standard IO)

Description Input Output Solution 有大佬說&#xff1a;可以用LCT做。&#xff08;會嗎&#xff1f;不會&#xff09; 對于蒟蒻的我&#xff0c;只好用水法&#xff08;3s&#xff0c;不虛&#xff09;。 首先選出的泡泡怪一定是連續的一段 L&#xff0c; R 然后 L 一定屬于蟲…

python 3.x 爬蟲基礎---http headers詳解

python 3.x 爬蟲基礎 python 3.x 爬蟲基礎---http headers詳解 python 3.x 爬蟲基礎---Urllib詳解 python 3.x 爬蟲基礎---Requersts,BeautifulSoup4&#xff08;bs4&#xff09; python 3.x 爬蟲基礎---正則表達式 前言  上一篇文章 python 爬蟲入門案例----爬取某站上海租房…

Webpack進階(三)

懶加載 lazy loading 用到的時候才加載vue 首屏不加載index.js const oBtn document.getElementById(j-button) oBtn.onclick async function () {const div await createElement()document.body.appendChild(div) } async function createElement() {const { default: _ …

P2634 [國家集訓隊]聰聰可可

鏈接&#xff1a;https://www.luogu.org/problemnew/show/P2634 題目描述 聰聰和可可是兄弟倆&#xff0c;他們倆經常為了一些瑣事打起來&#xff0c;例如家中只剩下最后一根冰棍而兩人都想吃、兩個人都想玩兒電腦&#xff08;可是他們家只有一臺電腦&#xff09;……遇到這種問…

算法 --- 快慢指針判斷鏈表是否有環

解題思路: 分別設置2個指針(s,q)指向鏈表的頭部,s每次指向下面一個(s s.next),q每次指向下面2個(q q.next.next). 如果存在環,q總會在某一時刻追上s /*** Definition for singly-linked list.* function ListNode(val) {* this.val val;* this.next null;* }*//**…

APP拉起小程序

結論&#xff1a;APP可以喚起小程序&#xff0c;前提是APP開發者在微信開放平臺帳號下申請移動應用&#xff0c;通過審核并關聯小程序&#xff0c;參考如下&#xff1a; 準備工作: APP開發者認證微信開放平臺 https://kf.qq.com/faq/170824URbmau170824r2uY7j.html APP開發者…

node --- 使用nrm改變npm的源

說明: 1.nrm只是單純的提供了幾個常用的下載包的URL地址,方便我們再使用npm裝包是 很方便的進行切換. 2.nrm提供的cnpm 和通過 cnpm裝包是2個不同的東西(使用cnpm install必須先安裝cnpm -> npm install -g cnpm) 安裝nrm: // linux $ [sudo] npm install --global nrm// w…

MySQL教程(三)—— MySQL的安裝與配置

1 安裝MySQL 打開附件中的文件&#xff08;分別對應電腦系統為32/64位&#xff09;。點next。 三個選項&#xff0c;分別對應典型安裝、自定義安裝和完全安裝&#xff0c;在此選擇典型安裝&#xff08;初學者&#xff09;。 點install。 廣告&#xff0c;忽略它。 安裝完成…

算法面經之百度

一、百度 前言&#xff1a;本來不打算寫百度面筋的&#xff0c;因為二面表現自我感覺實在太差了&#xff0c;像是被生活抽了一記耳光&#xff0c;不愿再去揭傷疤&#xff0c;奈何&#xff0c;半個月過去了&#xff0c;昨天又被百度從備胎池拉出來涮了一遍&#xff0c;涮的時候也…

flask-session總結

一、session session和cookie的原理和區別&#xff1a; cookie是保存在瀏覽器上的鍵值對 session是存在服務端的鍵值對&#xff08;服務端的session就是一個大字典&#xff0c;字典中是隨機字符串&#xff09;&#xff08;session與request原理相同&#xff09;&am…

c++ --- 字符串中的標點符號

題外話: 最近看node,發現node中好多強大的功能都設計到C,為了加深對node的理解,開始簡單的學習一下C語法 ispunct: 統計string對象中標點符號的個數 #include <iostream> using namespace std; int main () {string s ("Hello World!");decltype(s.size()) p…

Hadoop(5)-Hive

在Hadoop的存儲處理方面提供了兩種不同的機制&#xff0c;一種是之前介紹過的Hbase&#xff0c;另外一種就是Hive&#xff0c;有關于Hbase&#xff0c;它是一種nosql數據庫的一種&#xff0c;是一種數據庫&#xff0c;基于分布式的列式存儲&#xff0c;適合海量數據的操作&…

高精——模板

紫書&#xff1a; #include <iostream> #include <string> #include <cstring> #include <cstdio> using namespace std; const int maxn 1000; struct bign{ int d[maxn], len; void clean() { while(len > 1 && !d[len-1]) …