亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解Web使用webpack構建前端項目

2019-11-19 15:19:11
字體:
來源:轉載
供稿:網友

好久沒寫技術博客了, 原因在于最近在學習前端方面的技術, 熟悉我的同學都知道, 之前我有使用Vue搭建了一個個人簡歷, 體驗了一把最新的前端技術, 但之前我們使用的是vue-cli腳手架工具, 對于如何自己實現前端構建工具, 當下最為流行的就是webpack和gulp了, 之前一篇我們講了gulp, 這一篇我們來好好討論webpack.

說起webpack, 想必做前端的同學肯定不會陌生, 其實之前我們使用gulp構建的時候, 也使用了webpack的打包技術, 其實gulp和webpack并不是相互替代的關系, 而是相輔相成, 今天我們就來好好看看webpack的神奇之處吧.

我們學習一樣新技術, 首先肯定是從他的官方文檔入手, 當然我們要學習也是學最新版的.webpack的官方教程寫的非常好, 一步一步講的很到位, 各位同學可以直接閱讀官方文檔, 比起博客中的二手, 三手以及四手的資料, 官方文檔肯定是你更好的選擇.

這篇文章, 不是教你什么看這一篇就夠了之類的對于官方文檔拷貝的水文, 而是能讓你快速上手并且覺得所謂的webpack其實也就這么一回事, webpack你只要記住一個中心思想, 就和上面的圖示一樣, 將所有錯綜復雜的文件邏輯打包壓縮成幾個靜態資源, 不多說了, 我們還是看代碼來的實際.

webpack.config.js

對于一些拋棄jquery迎接react和vue的前端開發者來說, webpack雖然可能自己沒有寫過, 但看總是看過的吧, 一般來說, 都會有一個webpack.config.js的webpack配置文件.下面的代碼就是一個簡單的webpack的配置, 麻雀雖小五臟俱全.

var debug = process.env.NODE_ENV !== "production"; //是否是測試環境var webpack = require('webpack'); //導入webpack包var path = require('path');module.exports = { //導出 webpack固定寫法 context: path.join(__dirname), devtool: debug ? "inline-sourcemap" : null, //是否使用map工具, 用于瀏覽器debug entry: "./src/js/root.js", //打包的實體 module: {  loaders: [ //加載的配置   {    test: //.js?$/,    exclude: /(node_modules)/,    loader: 'babel-loader',    query: {     presets: ['react', 'es2015'], //添加預處理器     plugins: ['react-html-attrs'], //添加組件的插件配置    }   },   { test: //.css$/, loader: 'style-loader!css-loader' },   {    test: //.less$/,    loader: "style!css!less"   }  ] }, output: { //輸出的路徑及文件名  path: __dirname,  filename: "./src/bundle.js" }, plugins: debug ? [] : [ //一些插件  new webpack.optimize.DedupePlugin(),  new webpack.optimize.OccurenceOrderPlugin(),  new webpack.optimize.UglifyJsPlugin({ mangle: false, sourcemap: false }), ],};

webpack主要包括entry, module, output, plugins四大類, 官方文檔說的已經很清楚了, 想要進一步的學習,請翻閱官方文檔, 如果不想折騰直接拷貝上述代碼即可.

相較gulp, webpack在打包方面更為精簡, 這也是流行的原因吧, 但光看上面的文件, 的確也是簡單, 但是還有進一步改善的空間.

package.json

對于npm的介紹我就不多說了, 我們直接來看文件.

{ "name": "webpack", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { //命令行工具  "test": "echo /"Error: no test specified/" && exit 1",  "watch": "webpack --progress --watch",  "start": "webpack-dev-server --open --config webpack.dev.js",  "build": "webpack --config webpack.prod.js" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { //開發環境依賴  "babel-loader": "^7.1.2",  "clean-webpack-plugin": "^0.1.16",  "css-loader": "^0.28.7",  "csv-loader": "^2.1.1",  "file-loader": "^0.11.2",  "html-webpack-plugin": "^2.30.1",  "json-loader": "^0.5.7",  "lodash": "^4.17.4",  "style-loader": "^0.18.2",  "uglifyjs-webpack-plugin": "^0.4.6",  "webpack": "^3.6.0",  "webpack-dev-middleware": "^1.12.0",  "webpack-dev-server": "^2.8.2",  "webpack-merge": "^4.1.0",  "xml-loader": "^1.2.1" }, "dependencies": { //生產環境依賴  "babel-plugin-import": "^1.5.0",  "babel-plugin-react-html-attrs": "^2.0.0",  "babel-preset-es2015": "^6.24.1",  "babel-preset-react": "^6.24.1",  "babelify": "^7.3.0",  "react": "^15.6.1",  "react-dom": "^15.6.1",  "react-mixin": "^4.0.0",  "react-router": "^4.2.0" }}

命令行工具就是npm run build等于執行了webpack --config webpack.prod.js, 而npm start 等于執行了webpack-dev-server --open --config webpack.dev.js.簡單易懂吧.

在項目依賴中, 哦們加了很多的插件和loader, 都是用來搭建webpack的, 官方文檔的教程中都會講到, 值得注意的就是webpack-merge這個包, 這個包可以讓我們生產環境和開發環境很好的隔離配置, 我們看看怎么做呢?

首先我們需要將之前的webpack.config.js分成三個文件 --- webpack.common.js, webpack.dev.js, webpack.prod.js.

webpack.common.js

這個是webpack的共同配置, 總體和之前看到的大同小異, 我們主要是導入了兩個插件, 一個是清除插件, 一個是創建html的插件.

const path = require('path');const webpack = require('webpack');const CleanWebpackPlugin = require('clean-webpack-plugin');const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = { entry: './src/index.js', plugins: [  new CleanWebpackPlugin(['dist']),  new HtmlWebpackPlugin({title: 'webpack'}),  new webpack.HashedModuleIdsPlugin() ], output: {  filename: '[name].[chunkhash].js',  path: path.resolve(__dirname, 'dist') }, module: {  rules: [   {    test: //.js?$/,    exclude: /(node_modules)/,    loader: 'babel-loader',    query: {     presets: [      'react', 'es2015'     ],     plugins: ['react-html-attrs']    }   },   {    test: //.css$/,    use: ['style-loader', 'css-loader']   }, {    test: //.(png|svg|jpg|gif)$/,    use: ['file-loader']   }, {    test: //.(woff|woff2|eot|ttf|otf)$/,    use: ['file-loader']   }, {    test: //.(csv|tsv)$/,    use: ['csv-loader']   }, {    test: //.xml$/,    use: ['xml-loader']   }  ] }};

rules配置中我們也就是將一些可能用到的文件也配置到webpack中來, babel-loader這種如果要講還可以再開一篇, 其實就是個js的兼容性工具, 這樣理解就可以了.

webpack.dev.js

webpack開發環境的配置, 非常簡單, 就是用了之前講的webpack-merge工具, 就和git一樣, 合并了webpack.common.js的配置外新加了可以進行調試的inline-source-map工具, 以及熱更新的內容索引.

const merge = require('webpack-merge');const common = require('./webpack.common.js');module.exports = merge(common, { devtool: 'inline-source-map', devServer: {  contentBase: './dist' }});

webpack.prod.js

webpack生產環境的配置, 新加了一個壓縮插件以及環境配置的插件, 這里的開發工具和開發還款下的有所不同, 具體可直接看官方文檔.

const webpack = require('webpack');const merge = require('webpack-merge');const UglifyJSPlugin = require('uglifyjs-webpack-plugin');const common = require('./webpack.common.js');module.exports = merge(common, { devtool: 'source-map', plugins: [  new UglifyJSPlugin({sourceMap: true}),  new webpack.DefinePlugin({   'process.env': {    'NODE_ENV': JSON.stringify('production')   }  }) ]});

terminal

這樣我們就配置完成啦, 我們在終端上輸入看下效果:

cd ../ && npm i 

首先我們進入到目錄下并進行node包的安裝.

npm run build

MacBook-Pro-15:webpack zhushuangquan$ npm run build> webpack@1.0.0 build /Users/zhushuangquan/Documents/code/webpack> webpack --config webpack.prod.jsclean-webpack-plugin: /Users/zhushuangquan/Documents/code/webpack/dist has been removed.Hash: 85b65f54ef1436b295a5Version: webpack 3.6.0Time: 1148ms              Asset    Size Chunks       Chunk Names  main.014ac9aa420264da48eb.js 671 bytes    0 [emitted] mainmain.014ac9aa420264da48eb.js.map  6.47 kB    0 [emitted] main           index.html 197 bytes     [emitted] [lVK7] ./src/index.js 184 bytes {0} [built]Child html-webpack-plugin for "index.html":   1 asset  [3IRH] (webpack)/buildin/module.js 517 bytes {0} [built]  [DuR2] (webpack)/buildin/global.js 509 bytes {0} [built]    + 2 hidden modules

我們可以看到已經打包好的文件:

main.014ac9aa420264da48eb.js

!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s="lVK7")}({lVK7:function(e,n,t){"use strict";document.body.appendChild(function(){var e=document.createElement("div");return e.innerHTML="Hello webpack",e}())}});//# sourceMappingURL=main.014ac9aa420264da48eb.js.map

我們可以看到在webpack的打包和壓縮下, 代碼已經基本不可讀了. 所以我們需要加上之前的調試插件, 以便生產環境出現bug后的補救.

npm start

MacBook-Pro-15:webpack zhushuangquan$ npm start> webpack@1.0.0 start /Users/zhushuangquan/Documents/code/webpack> webpack-dev-server --open --config webpack.dev.jsclean-webpack-plugin: /Users/zhushuangquan/Documents/code/webpack/dist has been removed.Project is running at http://localhost:8080/webpack output is served from /Content not from webpack is served from ./distwebpack: wait until bundle finished: /Hash: 06f20ec519d58fbd5c28Version: webpack 3.6.0Time: 1460ms            Asset    Size Chunks          Chunk Namesmain.5eb4d4e3f458c49658a2.js   852 kB    0 [emitted] [big] main         index.html 197 bytes     [emitted]     [6Um2] (webpack)/node_modules/url/util.js 314 bytes {0} [built][8o/D] (webpack)-dev-server/client/overlay.js 3.71 kB {0} [built][HPf+] (webpack)/node_modules/url/url.js 23.3 kB {0} [built][Lx3u] (webpack)/hot/log.js 1.04 kB {0} [optional] [built][Sj28] (webpack)-dev-server/node_modules/strip-ansi/index.js 161 bytes {0} [built][TfA6] (webpack)/hot nonrecursive ^/.//log$ 170 bytes {0} [built][U2me] (webpack)/hot/emitter.js 77 bytes {0} [built][V3KU] (webpack)-dev-server/client/socket.js 1.04 kB {0} [built][cMmS] (webpack)-dev-server/client?http://localhost:8080 7.27 kB {0} [built][gqsi] (webpack)-dev-server/node_modules/loglevel/lib/loglevel.js 7.74 kB {0} [built]  [0] multi (webpack)-dev-server/client?http://localhost:8080 ./src/index.js 40 bytes {0} [built][gt+Q] (webpack)-dev-server/node_modules/ansi-regex/index.js 135 bytes {0} [built][lVK7] ./src/index.js 184 bytes {0} [built][p7Vd] (webpack)/node_modules/punycode/punycode.js 14.7 kB {0} [built][pEPF] (webpack)/node_modules/querystring-es3/index.js 127 bytes {0} [built]  + 73 hidden modulesChild html-webpack-plugin for "index.html":   1 asset  [3IRH] (webpack)/buildin/module.js 517 bytes {0} [built]  [DuR2] (webpack)/buildin/global.js 509 bytes {0} [built]  [M4fF] ./node_modules/lodash/lodash.js 540 kB {0} [built]  [a/t9] ./node_modules/html-webpack-plugin/lib/loader.js!./node_modules/html-webpack-plugin/default_index.ejs 538 bytes {0} [built]webpack: Compiled successfully.

我們可以看到打開了一個內容為Hello webpack的網頁在8080端口, 當我們修改了文件時候網頁會自動刷新.

知識點:

回到我們剛才的package.json的命令行配置來看.

 "scripts": { //命令行工具  "test": "echo /"Error: no test specified/" && exit 1",  "watch": "webpack --progress --watch",  "start": "webpack-dev-server --open --config webpack.dev.js",  "build": "webpack --config webpack.prod.js" },
  • 上面的npm run build => webpack => webpack.prod.js, 就是執行了生產環境的配置的打包命令.
  • 上面的npm start => webpack-dev-server --open => webpack.dev.js, 就是執行了開發環境配置的服務端命令.
  • --config是用于執行webpack配置文件的命令, 而默認為webpack.config.js.
  • webpack命令就是和之前的gulp的邏輯相似, 將entry實例復制到output路徑的邏輯. 當然還伴隨著一系列的操作.
  • webpack-dev-server --open命令是打開服務器并進行熱加載的用途.

以上就是webpack的使用及邏輯, 并沒有想象中的復雜吧, 甚至可以說是簡單, 實測一天即可入門webpack.

由于webpack的配置是固定代碼, 我已經打包上傳github, 需要的同學可以進行下載.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
68精品国产免费久久久久久婷婷| 蜜臀久久99精品久久久无需会员| 日韩电影在线观看免费| 97久久久免费福利网址| 久久亚洲成人精品| 久色乳综合思思在线视频| 久久精品99久久久久久久久| 成人av在线亚洲| 精品视频偷偷看在线观看| 亚洲精品一区中文| 91在线高清免费观看| 久久精品美女视频网站| 91超碰中文字幕久久精品| 黑人精品xxx一区一二区| 国产精品入口尤物| 久热国产精品视频| 欧美洲成人男女午夜视频| 午夜精品免费视频| 成人免费视频网址| 亚洲在线观看视频| 亚洲一区美女视频在线观看免费| 久久香蕉国产线看观看av| 伊人青青综合网站| 九九久久久久久久久激情| 日韩在线观看免费全| 91av视频在线免费观看| 色999日韩欧美国产| 精品国产欧美一区二区三区成人| 日韩av一区二区在线| 欧美大片欧美激情性色a∨久久| 欧美日韩在线观看视频小说| 97久久久免费福利网址| 91麻豆国产精品| 亚洲一品av免费观看| 91精品国产高清久久久久久久久| 91精品国产99| 日韩欧美精品网站| 精品国偷自产在线视频| 日韩成人激情影院| 伊人久久大香线蕉av一区二区| 91亚洲va在线va天堂va国| 国产精品揄拍一区二区| 久久久精品国产一区二区| 亚洲免费高清视频| 日韩最新av在线| 国产精品网站大全| 97国产精品免费视频| 亚洲成年人在线| 日韩中文字幕久久| 国产一区二区av| 国产欧美精品在线| 欧美在线视频在线播放完整版免费观看| 精品自拍视频在线观看| 狠狠综合久久av一区二区小说| 亚洲激情视频网站| 国产精品99免视看9| 日韩一区二区久久久| 亚洲精品成人免费| 国产精品久久久久久久久久久不卡| 国产精品99久久久久久白浆小说| 亚洲第一网站免费视频| 日韩欧美在线视频免费观看| 欧美日韩高清区| 中文字幕无线精品亚洲乱码一区| 国产精欧美一区二区三区| 久久网福利资源网站| 97色在线视频| 91性高湖久久久久久久久_久久99| 九九热精品视频国产| 粉嫩老牛aⅴ一区二区三区| 久久久国产精品亚洲一区| 日韩一区二区三区xxxx| 国产精品扒开腿做爽爽爽男男| 日韩国产欧美精品一区二区三区| 久久久国产一区二区| 中文亚洲视频在线| 91久久久久久久| 国产精品视频一| 久久91亚洲人成电影网站| 国产精品视频中文字幕91| 亚洲欧美在线播放| 国产精品久久久久久久久粉嫩av| 欧美孕妇孕交黑巨大网站| 国产精品91在线观看| 性欧美xxxx视频在线观看| 亚洲理论在线a中文字幕| 26uuu日韩精品一区二区| 中文字幕av一区二区| 国产精品久久久久久久久久新婚| 国产丝袜视频一区| 最新国产成人av网站网址麻豆| 欧美丝袜一区二区| 亚洲人成在线观看| 91精品视频免费观看| 日本精品视频在线播放| 91亚洲精品久久久| 亚洲女同性videos| 国产精品久久97| 成人久久18免费网站图片| 日韩a**站在线观看| 97在线观看免费| 亚洲精品自拍第一页| 亚洲xxx自由成熟| 国产视频999| 国产精品一区二区三| 欧美亚洲第一区| 久久99久久久久久久噜噜| 欧美电影在线观看完整版| 高潮白浆女日韩av免费看| 欧美交受高潮1| 韩剧1988免费观看全集| 久久精品国产2020观看福利| 久久久久久久久久久久久久久久久久av| 日韩视频免费看| 国内精品中文字幕| 亚洲精品大尺度| 国产精品成人av性教育| 欧美乱人伦中文字幕在线| 国产精品久久久久久av福利软件| 91精品国产乱码久久久久久久久| 久久久999精品免费| 日韩在线中文字| 午夜精品久久久久久99热软件| 日本aⅴ大伊香蕉精品视频| 热久久视久久精品18亚洲精品| 久久久影视精品| 日韩在线视频免费观看高清中文| 精品福利一区二区| 国产精品一久久香蕉国产线看观看| 奇门遁甲1982国语版免费观看高清| 欧美国产亚洲视频| 麻豆乱码国产一区二区三区| 久久久久在线观看| 欧美视频免费在线观看| 欧美在线国产精品| 国产女人18毛片水18精品| 亚洲国产婷婷香蕉久久久久久| 久久久久久尹人网香蕉| 久久这里只有精品99| 久久6精品影院| 久久综合久中文字幕青草| 欧美中文字幕在线视频| 91黑丝高跟在线| 欧美极品在线播放| 91香蕉嫩草神马影院在线观看| 色综合色综合久久综合频道88| 欧美日韩国产页| 久久久久久综合网天天| 一本一道久久a久久精品逆3p| 色偷偷亚洲男人天堂| 欧美国产视频日韩| 97视频免费在线看| 欧美怡红院视频一区二区三区| 国产98色在线| www.日本久久久久com.| 亚洲人精品午夜在线观看| 在线精品国产成人综合| 91福利视频在线观看| 亚洲片国产一区一级在线观看| 日韩av免费看网站| 日韩电影在线观看中文字幕| 亚洲久久久久久久久久久| 最新91在线视频| 91欧美精品午夜性色福利在线|