3 Webpack
1 什么是Webpack
https://webpack.js.org/ (官網)
webpack 是一個現代 javascript 應用程序的 靜態模塊打包器 (module bundler)
待會要學的 vue-cli 腳手架環境, 集成了 webpack, 所以才能對各類文件進行打包處理
webpack是一個 靜態模塊 打包器,可以做以下的這些工作
-
語法轉換(主要是瀏覽器兼容)
- less/sass轉換成css
- ES6轉換成ES5
- …
-
html/css/js 代碼壓縮合并 (打包)
-
webpack可以在開發期間提供一個開發服務器
可以把它看成maven中工程自動化那部分(jar) ,前端項目也是先打包再上線
2 Webpack安裝
全局安裝
cnpm install webpack@4.41.5 -g
cnpm install webpack-cli@3.3.12 -g
安裝后查看版本號
webpack -v
webpack-cli -v
3 快速入門 (js打包)
方式一:webpack原始方式
(1)新建文件夾 work3,在創建src文件夾,創建 bar.js
exports.info=function(str){document.write(str);
}
(2)src下創建logic.js
exports.add=function(a,b){return a+b;
}
(3)src下創建main.js
var bar= require('./bar');
var logic= require('./logic');
bar.info( 'Hello world!'+ logic.add(100,200));
說明:上述具有多個js文件,那么我們在實際開發中使用的時候會導入過多的js文件,使用起來不方便,那么我們可以將上述多個js文件打包成一個js文件。
(4)創建配置文件webpack.config.js ,該文件與src處于同級目錄
var path = require("path"); // 導入 node.js 中專門操作路徑的模塊,固定寫法
//執行webpack命令的時候會讀取到module.exports中的內容
module.exports = {//執行webpack命令的時候,讀取入口main.js,由于main.js關聯bar.js和logic.js,所以會將這三個js文件合并到一個js文件中entry: './src/main.js', // 打包入口文件的路徑//輸出文件位置output: {//__dirname表示當前工程目錄path: path.resolve(__dirname, './dist'), // 輸出文件的存放路徑filename: 'bundle.js' // 輸出文件的名稱}
};
以上代碼的意思是:讀取當前目錄下src文件夾中的main.js(入口文件)內容,把對應的js文件打包,打包后的文件放入當前目錄的dist文件夾下,打包后的js文件名為bundle.js
webpack 的 4.x 版本中默認約定:
- 打包的入口文件為 src -> main.js
- 打包的輸出文件為 dist -> index.js
(5)執行編譯命令
webpack
執行后查看bundle.js 會發現里面包含了上面兩個js文件的內容
(6)創建index.html ,引用bundle.js
<!doctype html>
<html><head> </head><body> <script src="dist/bundle.js"></script></body>
</html>`
創建完畢,完整目錄如下
測試調用index.html,會發現有內容輸出:Hello world!300
方式二:基于NPM方式
-
新建項目空白目錄,并運行
npm init –y
命令,初始化包管理配置文件package.json-y 可以直接跳過配置
-
新建 src 源代碼目錄,并且把 bar.js 和 logic.js 和 main.js 文件復制到 src目錄
-
創建index.html ,引用bundle.js
<!doctype html> <html><head> </head><body> <script src="dist/bundle.js"></script></body> </html>
-
運行
npm install webpack webpack-cli
命令,安裝webpack相關的包如果全局安裝過webpack 和 webpack-cli工具, 此步驟可跳過
-
在項目根目錄中,創建名為webpack.config.js 的 webpack配置文件同上
var path = require("path"); module.exports = {mode: 'development', // mode 用來指定構建模式development、productionentry: './src/main.js',output: {path: path.resolve(__dirname, './dist'),filename: 'bundle.js'} };
mode: ‘development’ //mode 用來指定構建模式、production:生產模式(壓縮)
-
在 package.json 配置文件中的scripts節點下,新增dev腳本如下:
{"name": "work4","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack" //script 節點下的腳本,可以通過 npm run 執行},"keywords": [],"author": "","license": "ISC" }
完整代碼結構:
在終端中運行
npm run dev
命令,啟動webpack進行項目打包。注意是在package.json 包下運行該命令
點擊index.html文件查看結果, 會發現有內容輸出:`Hello world!300
說明:使用npm命令運行的原因是后期使用webpack命令的時候,命令會很多,不僅僅只有webpack幾個字母,不好記,而使用:npm run dev命令執行無論webpack命令有多少都會執行。
4 webpack-dev-server 開發服務器
4.1 介紹
修改main.js代碼如下:
需要每次在修改源碼之前需要重新打包:
每次修改代碼, 都需要重新打包, 才能看到最新的效果, 且實際工作中, 打包非常費時 (30s - 60s) 之間
為什么費時?
- 構建依賴
- 讀取對應的文件, 才能加載
- 用對應的 loader 進行處理
- 將處理完的內容, 寫入到 dist 目錄
簡而言之就是我們希望修改源碼完畢之后,不用再每次重新打包,運行的結果直接是修改后的結果。
解決方案:我們可以開啟一個開發服務器webpack-dev-server, 在電腦內存中打包, 緩存一些已經打包過的內容, 只重新打包修改的文件 (熱更新)
4.2 使用
如果模塊(work3)下,沒有package.json 文件,那么需要在模塊下初始化命令:npm init即可
-
修改 package.json -> scripts 中的 dev, dependencies, devDependencies如下:
devDependencies這是開發時依賴, 上線不依賴
{"name": "work4","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack-dev-server"},"keywords": [],"author": "","license": "ISC","dependencies": {"webpack": "^4.41.5","webpack-cli": "^3.3.12"},"devDependencies": { "webpack-dev-server": "^3.11.2"}
}
然后運行 cnpm install 指令,安裝webpack,webpack-cli 和 webpack-dev-server
- 修改 webpack.config.js 文件,添加 devServer
var path = require("path");
module.exports = {mode: 'development', // mode 用來指定構建模式development、productionentry: './src/main.js',devServer: {port: 8099,// 服務器占用8099端口open: true // 自動打開瀏覽器},output: {path: path.resolve(__dirname, './dist'),filename: 'bundle.js'}
};
-
刪除之前的dist目錄
-
將 index.html 中,script 腳本的引用路徑
<!doctype html> <html><head> </head><body> <!-- 內存中讀取 --><script src="/bundle.js"></script></body> </html>
-
運行 npm run dev 命令
-
在瀏覽器中訪問 http://localhost:8099地址,查看自動打包效果
webpack-dev-server 會啟動一個實時打包的 http 服務器
webpack-dev-server 打包生成的輸出文件,默認放到了項目根目錄中,基于內存