Webpack入門到入土的晉級(jí)之路

      網(wǎng)友投稿 797 2025-04-02

      大一統(tǒng)的模塊化規(guī)范–ES6模塊化


      打開終端,輸入命令:

      npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node

      Webpack從入門到入土的晉級(jí)之路

      安裝完畢之后,輸入命令安裝:

      npm install --save @babel/polyfill

      項(xiàng)目根目錄創(chuàng)建babel.config.js文件,內(nèi)部代碼如下

      const presets = [ ["@babel/env",{ targets:{ edge:"17", firefox:"60", chrome:"67", safari:"11.1" } }] ] //暴露 module.exports = { presets }

      創(chuàng)建一個(gè)測(cè)試文件(隨便打印點(diǎn)東西就行)

      //創(chuàng)建了index.js文件 console.log('ok');

      在終端執(zhí)行命令

      npx babel-node ./index.js

      默認(rèn)導(dǎo)出語法:

      export default { 成員A, 成員B, ... }

      使用方法

      let num = 10; let cnt = 2; export default { num }//只暴露num

      默認(rèn)導(dǎo)入語法

      注意:接收名稱是自己定的,在當(dāng)前文件中使用的名稱

      // import 接收名稱 from "模塊標(biāo)識(shí)符" import index from './index.js' console.log(index);// { num: 10 }

      注意:在一個(gè)模塊中,只允許使用export default向外默認(rèn)暴露一次成員,不能寫多個(gè)export default,否則會(huì)報(bào)錯(cuò)

      小tip:

      如果在一個(gè)模塊中沒有向外暴露成員,其他模塊引入該模塊時(shí)將會(huì)得到一個(gè)空對(duì)象

      在導(dǎo)出的函數(shù)中能夠讀取到?jīng)]有被導(dǎo)出的值

      //index.js文件 let num = 10; let cnt = 2; function showCnt() { console.log(cnt); } export default { num, showCnt, }//這里的cnt并沒有被導(dǎo)出 //m1.js文件 import index from './index.js' index.showCnt();// 2

      按需導(dǎo)出語法

      export let age = 998; export let name = 'ljc'

      按需導(dǎo)入語法

      import {age, name} from './m2.js' console.log(name + age);// ljc19

      導(dǎo)出名需要和屬性名相對(duì)應(yīng),可以通過as來設(shè)置別名,例如:

      import {age ,name as nickname} from './m2.js' console.log(nickname + age);//ljc19

      這樣就實(shí)現(xiàn)了設(shè)置別名,設(shè)置別名后原先的名字就不能用了

      默認(rèn)和按需兩種方法共存

      //m2.js文件 導(dǎo)出 export let age = 19; export let name = 'ljc' let sex = '男' export default { sex } //m1.js文件 導(dǎo)入 import m2, {age, name as nickname} from './m2.js' console.log(m2);// { sex: '男' } console.log(nickname + age); //ljc19

      注意:一個(gè)模塊中既可以按需導(dǎo)入導(dǎo)出也可以默認(rèn)導(dǎo)入導(dǎo)出

      import "./m2.js";

      直接執(zhí)行,不接收模塊中暴露成員

      webpack正文

      webpack提供了模塊化支持,代碼壓縮混淆,解決js兼容問題,性能優(yōu)化等特性,提高了開發(fā)效率和項(xiàng)目的可維護(hù)性

      從實(shí)戰(zhàn)中學(xué)習(xí)更加有意義,之前看了很多個(gè)講師的視頻,有點(diǎn)枯燥無厘頭了,聽完了完全不知道學(xué)到了什么

      創(chuàng)建項(xiàng)目目錄并初始化

      終端運(yùn)行npm init -y命令,作用是初始化包管理器配置文件package.json

      項(xiàng)目目錄

      src --> index.html //新建src文件夾下創(chuàng)建index文件

      創(chuàng)建首頁及js文件

      寫一下隔行變色項(xiàng)目的結(jié)構(gòu),然后在src目錄下創(chuàng)建index.js文件

      安裝jQuery

      終端輸入命令npm install jquery -S

      注意:這里是jquery不是jQuery

      導(dǎo)入jQuery

      import $ from "jquery"; $(function(){ $('li:odd').css('backgroundColor','pink'); $('li:even').css('backgroundColor','blue') })

      此時(shí)項(xiàng)目運(yùn)行會(huì)報(bào)錯(cuò),原先是第一行的代碼屬于ES6語法,瀏覽器存在兼容性問題

      因此我們通過webpack將代碼轉(zhuǎn)化為瀏覽器能夠兼容的代碼

      這部分學(xué)了n遍了,所以筆記有點(diǎn)預(yù)知未來的感覺,希望這次能有好結(jié)果

      運(yùn)行 npm install webpack webpack-cli –D 命令,安裝 webpack 相關(guān)的包

      在根目錄下創(chuàng)建webpack.config.js文件,在執(zhí)行webpack時(shí)會(huì)優(yōu)先從用戶自定義的配置文件中調(diào)用

      在配置文件中寫以下代碼,

      注意:mode的意思是文件導(dǎo)出格式,有生產(chǎn)模式和開發(fā)模式,生產(chǎn)模式的代碼會(huì)進(jìn)行壓縮,去掉所有空格之類的,代碼文件小,但是不利于我們的學(xué)習(xí),因此在學(xué)習(xí)的時(shí)候還是設(shè)置為開發(fā)模式

      這個(gè)配置文件在后面的學(xué)習(xí)中還會(huì)添加大量的內(nèi)容

      module.exports = { mode:"development"http://可以設(shè)置為development(開發(fā)模式),production(發(fā)布模式) }

      修改package.json文件,添加一點(diǎn)東西

      //未添加 "scripts": { "test": "echo \"Error: no test specified\" && exit 1", } //添加后 "scripts":{ "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack" }

      script對(duì)象下的配置屬性,可以通過 npm run 運(yùn)行

      例如:npm run dev,運(yùn)行dev啟動(dòng)webpack服務(wù)進(jìn)行項(xiàng)目打包

      如果這里報(bào)錯(cuò)

      請(qǐng)檢查兩個(gè)index文件是否存在于src目錄下

      可能是安裝jquery的時(shí)候打了大寫的Q

      在執(zhí)行完命令后,我們會(huì)發(fā)現(xiàn)項(xiàng)目目錄下多了個(gè)dist文件夾,這個(gè)文件夾存放的是通過webpack打包后的文件,也就是我們這個(gè)項(xiàng)目中轉(zhuǎn)為為瀏覽器兼容的代碼,因此我們將這個(gè)文件引入我們的index.html文件即可。

      通俗點(diǎn)說就是,這個(gè)是轉(zhuǎn)化好的文件,實(shí)現(xiàn)的效果和我們先前寫的一樣,但是這個(gè)文件實(shí)現(xiàn)了兼容,所以我們引用的時(shí)候,引用這個(gè)文件就好

      默認(rèn)會(huì)將src/index.js 作為默認(rèn)的打包入口js文件,默認(rèn)會(huì)將dist/main.js 作為默認(rèn)的打包輸出js文件

      我們可以通過配置之前所創(chuàng)建的配置文件(webpack.config.js)來自定義出入口文件

      const path = require('path');//導(dǎo)入node.js中操作路徑的模塊 module.exports = { entry: path.join(__dirname,"./src/index.js"),//設(shè)置入口文件路徑,絕對(duì)路徑 //配置出口文件 output:{ path:path.join(__dirname,"./dist"),//設(shè)置路徑 filename:"res.js"http://設(shè)置導(dǎo)出文件名稱 }, //模式選擇 mode: "development" }

      在上面的代碼中我們引用了node中的path模塊,path.join()用于連接路徑,會(huì)正確地使用當(dāng)前系統(tǒng)的路徑分隔符,也就是絕對(duì)路徑

      注意:在上面代碼中的出入口文件路徑,需要根據(jù)自己的文件目錄來寫,cv大概率報(bào)錯(cuò)噢

      我們每次修改代碼都要重新打包,太麻煩了,因此需要自動(dòng)打包

      安裝自動(dòng)打包工具

      npm install webpack-dev-server -D

      修改package.json文件中的dev指令,也就是我們自己先前添加的那個(gè)屬性(4.x版本)

      //修改前 "dev": "webpack" //修改后 "dev": "webpack-dev-server"

      注意:如果使用的webpack版本是5.x的,則需要將上面的配置文件修改為"dev": "webpack server",否則報(bào)錯(cuò)?;蛘呤褂胣px webpack serve運(yùn)行

      webpack版本可以通過終端命令webpack -v查看

      運(yùn)行npm run dev,進(jìn)行打包

      在運(yùn)行結(jié)果中,有相關(guān)的信息

      i ?wds?: Project is running at http://localhost:8080/ i ?wds?: webpack output is served from /

      第一行是服務(wù)器的地址,我們可以訪問這個(gè)地址來運(yùn)行我們的網(wǎng)頁

      第二行是文件的輸出路徑為/,這個(gè)意思是存放到了服務(wù)器的根目錄中

      注意:webpack server自動(dòng)打包的輸出文件,默認(rèn)放到了服務(wù)器的根目錄中

      這些地址文件目錄,我們都可以通過配置文件來更改

      記得要將js文件引入頁面中,通過第4步知道,文件存放于服務(wù)器的根目錄中,因此

      webpack server 會(huì)啟動(dòng)一個(gè)實(shí)時(shí)打包的http服務(wù)器

      輸出文件放在了服務(wù)器中,在項(xiàng)目目錄中看不見,不太友好

      利用這個(gè)插件生成一個(gè)預(yù)覽頁面,解決我們?cè)谠L問8080時(shí),直接看到的不是頁面的問題

      安裝包html-webpack-plugin

      npm install html-webpack-plugin -D

      修改配置文件

      引入下載好的包,配置相應(yīng)文件

      //導(dǎo)入包 const HtmlWebpackPlugin = require("html-webpack-plugin"); //創(chuàng)建對(duì)象 const htmlPlugin = new HtmlWebpackPlugin({ //設(shè)置生成預(yù)覽頁面的模板文件 template:"./src/index.html", //設(shè)置生成的預(yù)覽頁面名稱 filename:"index.html" })

      在這個(gè)對(duì)象中,新增plugins屬性,把實(shí)例化好的對(duì)象放進(jìn)去

      注意:plugins有s

      module.exports = { ... plugins:[ htmlPlugin ] }

      在很多視頻中都是先把這個(gè)配置文件的大體寫出來的,這個(gè)視頻不是,有點(diǎn)不習(xí)慣

      再次更改package.json文件中的dev屬性

      "dev": "webpack server --open --host 127.0.0.1 --port 9999"

      --open是自動(dòng)啟動(dòng)

      --host是指定地址

      --port是指定服務(wù)端口號(hào)

      也有另一種方法是通過修改webpack.config.js配置文件

      添加一個(gè)devServer屬性,配置相關(guān)信息

      module.exports = { ... output:{}, devServer: { port: 3030, publicPath: './dist' }, }

      這個(gè)真的超級(jí)常用,默認(rèn)情況下,webpack只能打包js文件,如果想要打包非js文件,需要調(diào)用loader加載器才能打包

      less-loader 可以打包處理 .less 相關(guān)的文件

      sass-loader 可以打包處理 .scss 相關(guān)的文件

      url-loader 可以打包處理 css 中與 url 路徑相關(guān)的文件

      loader調(diào)用過程

      注意:使用npm run dev是為了實(shí)時(shí)觀看頁面,但是不會(huì)生成文件,只是一個(gè)預(yù)覽效果,所以我們要生成文件的時(shí)候需要使用webpack命令打包

      安裝loader包

      npm install style-loader css-loader -D

      在 webpack.config.js 的 module -> rules 數(shù)組中,添加 loader 規(guī)則如下內(nèi)容如下

      output: {...}, module: { rules :[ { test:/\.css$/,//匹配css文件,匹配成功使用下面的loader use:[ 'style-loader', 'css-loader' ] } ] },

      注意:

      use 數(shù)組中指定的 loader 順序是固定的

      多個(gè) loader 的調(diào)用順序是:從后往前調(diào)用

      loader的擺放順序出錯(cuò)可能會(huì)報(bào)錯(cuò)

      打開終端,運(yùn)行命令,下載less-loader

      npm i less-loader less -D

      添加配置文件,匹配less文件,使用loader加載

      { test:/\.less$/, use:[ 'style-loader', 'css-loader', 'less-loader' ] }

      其實(shí)這部分理解了之后會(huì)很簡(jiǎn)單,上面這段代碼我們可以接在處理css文件后面繼續(xù)寫,也就是可以理解為rules數(shù)組存放大量的規(guī)則,每個(gè)規(guī)則都是一個(gè)包含test和use的對(duì)象,這樣就很清晰了

      這一部分內(nèi)容我是沒有成功的,查了很多資料都沒有成功,視頻課程講解的webpack版本是4.x,我用的是5.x,有些東西被棄用了,安裝==不成功==,所以可以跳過這部分

      打開終端,運(yùn)行命令,下包

      npm i sass-loader node-sass -D

      配置規(guī)則,繼續(xù)在rules中添加配置

      { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader' ] }

      打開終端,運(yùn)行命令

      npm install --save-dev mini-css-extract-plugin

      引入

      //css提取成單獨(dú)文件 const MiniCssExtractPlugin = require('mini-css-extract-plugin');

      更改用戶配置

      //更改css相關(guān)配置 { test: /\.css$/, use: [ //這里改以下 MiniCssExtractPlugin.loader, 'css-loader' ] } //創(chuàng)建插件對(duì)象 plugins: [ htmlPlugin, new MiniCssExtractPlugin() ]

      這個(gè)是真的香

      打開終端,運(yùn)行命令,安裝loader

      npm install postcss-loader autoprefixer -D

      在項(xiàng)目根目錄創(chuàng)建并配置postcss.config.js文件

      const autoprefixer = require("autoprefixer");//引入 module.exports = { plugins:[ autoprefixer ] }

      配置規(guī)則,更改rules數(shù)組

      //更改css相關(guān)配置 { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', //在這里添加新的loader規(guī)則 'postcss-loader' ] }

      webpack4使用optimize-css-assets-webpack-plugin插件,方法和上面的都一樣,引入,然后創(chuàng)建實(shí)例對(duì)象

      下面記錄webpack5的使用

      打開終端,安裝插件

      npm install css-minimizer-webpack-plugin --save-dev

      引入創(chuàng)建插件對(duì)象

      //引入 const CSSMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin'); ... //在plugins數(shù)組中創(chuàng)建 plugins: [ htmlPlugin, new MiniCssExtractPlugin(), new CSSMinimizerWebpackPlugin() ]

      在樣式表css中有時(shí)候會(huì)設(shè)置背景圖片和設(shè)置字體文件,一樣需要loader進(jìn)行處理

      使用url-loader和file-loader來處理打包圖片文件以及字體文件

      打開終端,安裝loader

      npm install url-loader file-loader -D

      配置loader文件

      { test:/\.(jpg|png|gif|bmp|ttf|eot|svg|woff|woff2)$/, use:"url-loader?limit= 8 * 1024" }

      注意:

      css樣式表中的文件才會(huì)通過這個(gè)插件被打包

      ?limit后面填的是字節(jié)大小,只有小于這個(gè)數(shù)的才會(huì)被直接打包,存放的是你自己寫的那個(gè)路徑,大于這個(gè)數(shù),會(huì)轉(zhuǎn)化為base64路徑

      在上一步中已經(jīng)安裝好了loader,添加配置文件即可

      { exclude:/\.(css|js|html|less|jpg|png|gif|bmp|ttf|eot|svg|woff|woff2)$/,//排除這些文件 loader:'file-loader', options: { name: '[hash:10].[ext]'//縮短文件名 } }

      打開終端,安裝babel

      npm install babel-loader @babel/core @babel/runtime -D

      安裝babel語法插件包

      npm install @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D

      在項(xiàng)目根目錄創(chuàng)建并配置babel.config.js文件

      module.exports = { presets:["@babel/preset-env"], plugins:[ "@babel/plugin-transform-runtime", "@babel/plugin-proposal-class-properties" ] }

      更改用戶配置文件中的rules,數(shù)組下繼續(xù)添加

      { test:/\.js$/, use:"babel-loader", //use表示該文件類型需要調(diào)用的loader exclude:/node_modules/ }

      css文件:

      在實(shí)例化的時(shí)候添加參數(shù)配置

      new MiniCssExtractPlugin({ filename: 'css/[name].css' })

      圖片文件

      在rules中添加options配置內(nèi)容

      { test: /\.(jpg|png|gif|bmp|ttf|eot|svg|woff|woff2)$/, use: [{ loader: "url-loader", options: { limit: 8 * 1024, name: '[hash:10].[ext]', esModule: false, outputPath: './imgs', publicPath: './imgs' // 開發(fā)環(huán)境配置 } }] }

      和上面一樣添加插件配置

      其實(shí)就是配置刪除空格和注釋

      // const htmlPlugin = new HtmlWebpackPlugin({ //設(shè)置生成預(yù)覽頁面的模板文件 template: "./src/index.html", //設(shè)置生成的預(yù)覽頁面名稱 filename: "index.html", //添加壓縮代碼 collapseWhitespace: true, removeComments: true, options: { esModule: false } })

      const path = require('path'); //導(dǎo)入node.js中操作路徑的模塊 //導(dǎo)入html包 const HtmlWebpackPlugin = require("html-webpack-plugin"); //創(chuàng)建對(duì)象 const htmlPlugin = new HtmlWebpackPlugin({ //設(shè)置生成預(yù)覽頁面的模板文件 template: "./src/index.html", //設(shè)置生成的預(yù)覽頁面名稱 filename: "index.html", //壓縮代碼 // collapseWhitespace:true, // removeComments:true, options: { esModule: false } }) //css提取成單獨(dú)文件 const MiniCssExtractPlugin = require('mini-css-extract-plugin'); //css壓縮 const CSSMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin'); module.exports = { entry: path.join(__dirname, "./src/js/index.js"), //設(shè)置入口文件路徑 //配置出口文件 output: { path: path.join(__dirname, "./dist"), //設(shè)置路徑 filename: "js/bundle.js" //設(shè)置導(dǎo)出文件名 }, module: { rules: [{ //處理css test: /\.css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader' ] }, { //處理less test: /\.less$/, use: [ 'style-loader', 'css-loader', 'less-loader' ] }, { //處理scss,不用 test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader' ] }, { //處理圖片 test: /\.(jpg|png|gif|bmp|ttf|eot|svg|woff|woff2)$/, use: [{ loader: "url-loader", options: { limit: 8 * 1024, name: '[hash:10].[ext]', esModule: false, outputPath: './imgs', publicPath: '../imgs' // 公共路徑 } }] }, { //處理其他資源 exclude: /\.(css|js|html|less|jpg|png|gif|bmp|ttf|eot|svg|woff|woff2)$/, loader: 'file-loader', options: { name: '[hash:10].[ext]', outputPath: 'media', publicPath: '../media' // 開發(fā)配置或者就行 } }, { //轉(zhuǎn)化高級(jí)js代碼 test: /\.js$/, use: "babel-loader", exclude: /node_modules/ } ] }, devServer: { //服務(wù)器相關(guān)配置 port: 9999, open: true }, target: 'web',//實(shí)時(shí)刷新 devtool: "eval-source-map", //后面會(huì)寫到 plugins: [ htmlPlugin, new MiniCssExtractPlugin({ filename: 'css/[name].css' }), new CSSMinimizerWebpackPlugin() ], //模式選擇 mode: "development" }

      性能優(yōu)化配置

      HMR對(duì)html,css,js都有不同的配置,js,和html文件默認(rèn)是不使用HMR功能的

      問題:如果我們只是修改了樣式文件,沒有被修改過的js等文件也會(huì)因?yàn)轫撁娴乃⑿露恢匦录虞d一次,所有的代碼被重新執(zhí)行一次即,這種情況往往不是我們想要的效果

      解決方法:使用HMR功能來完成這個(gè)需求。它的作用是當(dāng)一個(gè)模塊發(fā)生變化,只會(huì)重新打包這一個(gè)模塊,而不是打包加載所有模塊`,極大提升構(gòu)建速度

      devServer: { port: 9999, open: true, // 開啟HMR功能 // 新配置要想生效,必須重新webpack服務(wù) // 重新執(zhí)行npx webpack server指令 hot: true }

      HMR功能開啟后當(dāng)我們修改樣式文件,我們?cè)诳刂婆_(tái)上可以發(fā)現(xiàn)此時(shí)只有該樣式文件被重新加載刷新了,其他的文件不會(huì)重新輸出。

      注意:

      對(duì)于html文件不需要做HMR功能,因?yàn)橹挥幸粋€(gè)html文件,只要修改了,必定重新加載

      js文件用HMR感覺不太友好

      if (module.hot) { // 一旦 module.hot 為true,說明開啟了HMR功能。 // 額外添加下面的JS代碼 // 讓HMR功能代碼在此JS文件修改時(shí)生效 module.hot.accept('./print.js', function() { // 方法會(huì)監(jiān)聽 print.js 文件的變化 // 一旦發(fā)生變化,其他模塊不會(huì)重新打包構(gòu)建。 // 會(huì)執(zhí)行后面的回調(diào)函數(shù) print();//這是一個(gè)js文件下的函數(shù) }); }

      source-map是一種提供源代碼到構(gòu)建后代碼映射技術(shù),簡(jiǎn)單來說就是配置文件報(bào)錯(cuò)的提示方式,在配置文件中配置devtool即可

      devServer: {}, target: 'web',//實(shí)時(shí)刷新 devtool: "eval-source-map"

      直接配置在export對(duì)象下

      對(duì)于devtool配置有兩種方案,內(nèi)聯(lián)和外聯(lián)

      內(nèi)聯(lián)和外部的區(qū)別:

      外聯(lián)生成了文件,內(nèi)聯(lián)不生成

      內(nèi)聯(lián)構(gòu)建速度更快,但是文件體積會(huì)更大

      這里的配置選項(xiàng)相當(dāng)多,可以直接查看devtool

      開發(fā)環(huán)境

      需要考慮速度快,調(diào)試更友好

      推薦使用:eval-source-map(√) / eval-cheap-module-source-map

      生產(chǎn)環(huán)境

      內(nèi)聯(lián)會(huì)讓代碼體積變大,所以在生產(chǎn)環(huán)境不用內(nèi)聯(lián)

      推薦使用:source-map(√)

      在我們之前寫的rules中,每一個(gè)文件都會(huì)被所有的規(guī)則判斷一遍,這樣的操作是沒有必要的

      因此我們使用oneOf來解決這個(gè)問題,優(yōu)化我們的打包代碼

      在所有的rules外層用一個(gè)oneof數(shù)組包裹,也就是將我們之前寫的規(guī)則放在oneof數(shù)組中,oneof數(shù)組放在rules數(shù)組對(duì)象中

      rules: [ { oneOf:[...相關(guān)loader] } ]

      如果有需要匹配兩次以上的,需要將對(duì)應(yīng)的loader放在外部,和oneOf數(shù)組存在的對(duì)象同級(jí),可以通過添加enforce: 'pre'屬性,優(yōu)先執(zhí)行這個(gè)規(guī)則

      到這里其實(shí)后面還有很多的優(yōu)化沒有寫,但是真的有點(diǎn)枯燥,很多人說利用vue腳手架,能很輕松的解決掉了,所以我想webpack學(xué)習(xí)就先到這里吧,已經(jīng)花費(fèi)了太多的時(shí)間了,需要學(xué)習(xí)一些其他的東西,或者做一些demo來練習(xí)以下了!

      總結(jié)

      學(xué)習(xí)webpack的時(shí)間持續(xù)了非常久,在b站上也看了有4,5個(gè)老師的webpack視頻了,都是看完的那種,但是學(xué)到的東西很有限,基本上都是一些簡(jiǎn)單的配置教程,講講一些loader,插件的安裝,好用是真的好用,但是感覺還是差點(diǎn)意思。雖然webpack真的非常好,但是對(duì)于在網(wǎng)絡(luò)視頻中學(xué)習(xí)webpack可以說是掉了大坑,很多講師使用的webpack版本都是4.x版本的,現(xiàn)在2021年,一般新安裝的話都是直接安裝5.x版本,在最新的版本中有很多的東西廢棄掉了,導(dǎo)致了在跟著老師敲代碼的過程中,會(huì)有很多很多很多奇奇怪怪的報(bào)錯(cuò),導(dǎo)致學(xué)習(xí)的周期無限拉長(zhǎng),講真,我花了一大半的時(shí)間在查找怎么解決這些bug身上,在各大開發(fā)者社區(qū)上查找相關(guān)的解決方法,真的是大海撈針,雖然有很多解決方案,但是由于博客時(shí)間久遠(yuǎn),這個(gè)解決方案也被官方廢棄了(就很離譜),學(xué)到這里,我覺得最有效解決問題的方法是查看官方文檔webpack,雖然官方文檔真的很官方,我剛開始也看不下去,但是慢慢看下去之后,會(huì)發(fā)現(xiàn)其實(shí)這些也是能看的明白的!總之學(xué)習(xí)webpack真的需要很多的精力,有不明白的地方多查看官方文檔,或者還是查查博客的。

      JavaScript webpack

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:智能家居系統(tǒng)生產(chǎn)(智能家居系統(tǒng)生產(chǎn)廠家排名)
      下一篇:年前突擊2022最全Spark面試體系(1萬字,60長(zhǎng)圖,30+知識(shí)點(diǎn))
      相關(guān)文章
      亚洲一区二区三区国产精品无码| 亚洲三级在线播放| 国产精一品亚洲二区在线播放| 337p日本欧洲亚洲大胆艺术| 国产亚洲精品无码专区 | 亚洲日本天堂在线| 亚洲精品日韩专区silk| 国产AV无码专区亚洲AVJULIA| 在线精品亚洲一区二区小说| 亚洲AⅤ永久无码精品AA| 在线观看亚洲电影| 亚洲成AV人影片在线观看| 亚洲AV日韩综合一区| 亚洲欧洲日本国产| 亚洲日韩乱码久久久久久| 亚洲资源在线观看| 亚洲精品无码久久久久久久| 亚洲精品无码久久久久久久 | 亚洲国产精品乱码一区二区| 亚洲精品无码久久久影院相关影片| 久久久久亚洲?V成人无码| 亚洲国产精品专区在线观看 | 亚洲国产成人久久综合一区77 | 国产亚洲午夜高清国产拍精品| 丝袜熟女国偷自产中文字幕亚洲| 亚洲国产成人久久综合一区77| 久久亚洲国产成人影院网站| 亚洲情XO亚洲色XO无码| 亚洲线精品一区二区三区| 亚洲AV无码成人精品区在线观看| 久久精品亚洲综合一品| 亚洲男人电影天堂| 亚洲色大成WWW亚洲女子| 国产精品亚洲精品日韩电影| 国产精品亚洲αv天堂无码| 亚洲AV综合色一区二区三区| 亚洲精品电影在线| 亚洲精品一卡2卡3卡四卡乱码| 亚洲av午夜成人片精品电影| 亚洲精品无码久久一线| 精品日韩亚洲AV无码|