使用的webpack版本是 3.10.0css
demo的目錄結構:html
dist |-- //用來存放打包後的文件 src |--asset //存在須要打包的插件 |--page //存放入口文件以及模板文件
開始demo以前的一些準備:jquery
**webpack
npm initgit
npm install --save--dev webpack //本地安裝es6
npm install -g webpack //全局安裝github
下述模塊loader的主要做用是用於把es6,es7編寫的源碼轉換成讓瀏覽器識別的代碼web
npm install --save--dev babel-core babel-loader babel-preset-envshell
處理樣式的loader 將模塊的導出做爲樣式添加到 DOM 中npm
npm install --save--dev css-loader style-loader
處理文件字體的,圖片路徑的loader
npm install --save--dev file-loader url-loader
壓縮用到的插件
npm install --save--dev uglify-es uglifyjs-webpack-plugin
暴露全局的expose-loader ,用來處理jquery插件
npm install --save--dev expose-loader
期間我遇到的錯誤:
一開始打包的boostrap遇到的問題,出現一大堆關於boostrap引入字體,圖片,等等的一些錯誤,緣由:配置中沒有加入處理圖片的loader.
webconfig添加以下:
module:{ rules:[ //處理圖片 <br> { test: /\.(png|svg|jpg|gif)$/, use: ['file-loader'] }, //處理字體 <br> { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ 'file-loader' ] } ] }
主入口文件文件:main.js
require("../asset/bootstrap/css/bootstrap.css"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.eot"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.svg"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.ttf"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.woff"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.woff2");
測試文件test.html
<ul class="nav nav-pills"> <li role="presentation" class="active"><a href="#">Home</a></li> <li role="presentation"><a href="#">Profile</a></li> <li role="presentation"><a href="#">Messages</a></li> </ul>
打開瀏覽器便可看到熟悉的bootstrap樣式
主入口文件引入main.js
require("../asset/jquery.js");
注意 :
若是直接打包,不用loader處理或者插件處理,會出現$ is not undefinded,由於打包後,並無把$,jquery暴露出來,處於打包後本身的做用域中。
解決方案
我在此處用expose-loader解決這個問題,還有其它方案,具體看[官方文檔][1]
在配置文件中的module.rules 中設置以下:
解釋以下:用expose-loader暴露咱們的jquery全局變量,jQuery,$.
{ //jquery.js的路徑 test: require.resolve('./src/asset/jquery.js'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }
測試界面添加 test.html
<script> $(function(){ alert('a'); }) </script>
結果:webpack後,打開test.html 如期彈出 a.皆大歡喜^o^
本覺得這樣引入jQuery第三方插件沒問題,但後期引入jquery-ui時又遇到了問題,報錯not resolve jquery 云云....;
測試的插件
1.jquery-ul測試;
2.日期組件;測試UI組件的時候,出現出現juery模塊沒有找到的問題, 可能猜想:是我用測試的jquery-ul插件不是最新的
解決:
webpack.config.js 下配置 externals: { jquery: "jQuery" //若是要全局引用jQuery,無論你的jQuery有沒有支持模塊化,用externals就對了。 } 配合expose-loader使用; 瀏覽器控制檯和shell界面不報錯
主入口文件main.js
require("../asset/bootstrap/css/bootstrap.css"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.eot"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.svg"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.ttf"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.woff"); require("../asset/bootstrap/fonts/glyphicons-halflings-regular.woff2") require("../asset/jquery.js"); require("../asset/bootstrap/js/bootstrap.js"); //引入jquery-ui require("../asset/bootstrap-datetimepicker/jquery-ui.min.css"); require("../asset/bootstrap-datetimepicker/jquery-ui.min.js"); //引入日期插件 require("../asset/bootstrap-datetimepicker/bootstrap-datetimepicker.min.css"); require("../asset/bootstrap-datetimepicker/bootstrap-datetimepicker.js"); require("../asset/bootstrap-datetimepicker/bootstrap-datetimepicker.zh-CN.js");
//測試界面以下:test.html
測試界面以下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #toggle { width: 100px; height: 100px; background: #ccc; } </style> </head> <body> <ul class="nav nav-pills"> <li role="presentation" class="active"><a href="#">Home</a></li> <li role="presentation"><a href="#">Profile</a></li> <li role="presentation"><a href="#">Messages</a></li> </ul> <div id="toggle"></div> <form class="form-inline"> <div class="form-group"> <label>時間:</label> <div class="input-group date form_datetime_day"> <input type="text" class="form-control" id="start_date"> <span class="input-group-addon"> <span class="glyphicon glyphicon-calendar"></span> </span> </div> </div> </form> <script src="bundle.js"></script> <!-- <script src="../src/asset/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js"></script> --> <script> $(function(){ $( document ).click(function() { $( "#toggle" ).toggle( "blind" ); }); $('.form_datetime_day').datetimepicker({ language: 'zh-CN', format: 'yyyy-mm-dd hh:ii:ss', autoclose: true, todayBtn: true, showClear:true, startView: 'month', minView:'month', maxView:'decade', toolbarPlacement:'bottom', showTodayButton:false, icons:{today:'glyphicon glyphicon-time'}, todayBtn:'linked' }); console.log(jquery); }) </script> </body> </html>
測試日期組件的時候,遇到打包成功,可是瀏覽器控制檯報錯:出現 $().datepicker() is not a function.....通過排查,換了個新版本的boostrap-datepicker.js而後打包成功了.
猜想:1.多是源文件的boostrap-datepicke.js下載了被做了改動,
2.多是舊版本問題
最後wepack,jQuery-ui中的方法正常使用;
使用expose-loader
測試插件 : sweetalert2
若是一開始直接引入
main.js
//測試彈出框 require("../asset/sweetalert2/sweetalert2.min.js"); require("../asset/sweetalert2/sweetalert2.min.css");
test.html
<script> swal("hello world"); </script>
而後直接webpack,shell控制檯沒有紅色出現,問題是打開測試頁面後,沒有要的彈出框,瀏覽器下還包swal is not undefined.....,緣由是swal全局並無暴露出來
解決:
{ // 這裏是引入插件的路徑 test: require.resolve('./src/asset/sweetalert2/sweetalert2.min.js'), use: [{ loader: 'expose-loader', options: 'swal' //暴露的變量 ,設置爲swal }]
}
最後webpack,打開測試界面彈出熟悉的彈出框 hello word
github地址: https://github.com/zhuiye/webpack-learn