webpack3快速入門
一、webpack的介紹
什麼是webpack?
- webpack是一個模組打包器(bundler)
- 在webpack看來,前端的所有資原始檔(js/json/css/img/less/...)都會作為模組處理
- 它將根據模組的依賴關係進行靜態分析,生成對應的靜態資源
理解Loader:
- webpack本身只能載入js/json模組,如果要載入其它型別的檔案(模組),就需要使用對應的loader進行轉換/載入
- Loader本身也是執行在node.js環境中的javascript模組
- 它本身是一個函式,接受原始檔作為引數,返回轉換的結果
- loader一般以 xxx-loader 的方式命名,xxx代表這個loader 要做的轉換功能,比如 json-loader
配置檔案(預設)
webpack.config.js :是一個node模組,返回一個json 格式的配置資訊物件
外掛:
- 外掛可以完成一些loader不能完成的功能
- 外掛的使用一般是在webpack的配置資訊plugins選項中指定
- CleanWebpackPlugin :自動清除指定資料夾的資源
- HtmlWebpackPlugin :自動生成html資料夾
- UglifyJSPlugin :壓縮js檔案
二、學習文件
webpack官網:http://webpack.github.io/
webpack3文件(中文): https://doc.webpack-china.org/
三、開啟專案
1、初始化專案:
生成package.json檔案
{
"name":"webpack_test",
"version":"1.0.0"
}
2、安裝webpack
----npm i webpack -g //全域性安裝
----npm i webpack --save-dev //區域性安裝
下載1.0的
-----npm i [email protected] --save-dev這裡講一下為什麼要先全域性安裝後再區域性安裝,是因為webpack版本問題,1.0和3.0的版本互不相容,你電腦上面是用的webpack3.0的,公司的專案使用的是1.0的,此時公司專案對於你的電腦就不相容,你就在你的檔案目錄下區域性安裝一個1.0的。
四、編譯打包應用
* 建立入口src/js/ : entry.js
- document.write("entry.js is work");
* 建立主頁面: dist/index.html
- <script type="text/javascript" src="bundle.js"></script>
* 編譯js
- webpack src/js/entry.js dist/bundle.js //webpack 打包的檔案(入口) 打包後的檔案(出口)會新建資料夾
* 檢視頁面效果
五、新增js/json檔案
* 建立第二個js: src/js/math.js
```
export function square(x) {
return x * x;
}
export function cube(x) {
return x * x * x;
}
```
* 建立json檔案: src/json/data.json
```
{
"name": "Tom",
"age": 12
}
```
* 更新入口js : entry.js
```
import {cube} from './math'
import data from '../json/data.json'
//注意data會自動被轉換為原生的js物件或者陣列
document.write("entry.js is work <br/>");
document.write(cube(2) + '<br/>');
document.write(JSON.stringify(data) + '<br/>')
```
* 編譯js:
```
webpack src/js/entry.js dist/bundle.js
```
* 檢視頁面效果
六、使用webpack配置檔案
* 建立webpack.config.js
```
const path = require('path'); //path內建的模組,用來設定路徑。
module.exports = {
entry: './src/js/entry.js', // 入口檔案
output: { // 輸出配置
filename: 'bundle.js', // 輸出檔名
path: path.resolve(__dirname, 'dist') //輸出檔案路徑配置
}
};
```
* 配置npm命令: package.json
```
"scripts": {
"build": "webpack"
},
```
* 打包應用
```
npm run build
七、打包css和圖片檔案
* 安裝樣式的loader
```
npm install css-loader style-loader --save-dev
npm install file-loader url-loader --save-dev
補充:url-loader是物件file-loader的上層封裝,使用時需配合file-loader使用。
```
* 配置loader
```
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader', //可以把css-loader載入的樣式動態地應用到頁面中
'css-loader' //只負責載入css模組,沒辦法把css載入應用到當前頁面中
]
},
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader', //好處:打包小於8k的檔案,把檔案打包成base64放入js檔案中,以便少發一次請求(請求圖片)
options: {
limit: 8192
}
}
]
}
]
}
```
* 嚮應用中新增2張圖片:
* 小圖: img/logo.png
* 大圖: img/big.jpg
* 建立樣式檔案: src/css/test.css
```
body {
background: url('../img/logo.jpg')
}
```
* 更新入口js : entry.js
- import '../css/test.css'
* 新增css樣式#box1{
width: 300px;
height: 300px;
background-image: url("../image/logo.jpg");
}
#box2{
width: 300px;
height: 300px;
background-image: url("../image/big.jpg");
}* index.html新增元素
<div id="box1"></div>
<div id="box2"></div>
* 執行打包命令:
```
npm run build
```
* 發現問題:
* 大圖無法打包到entry.js檔案中,index.html不在生成資源目錄下。
* 頁面載入圖片會在所在目錄位置查詢,導致頁面載入圖片時候大圖路徑無法找到
* 解決辦法:
* 使用publicPath : 'dist/js/' //設定為index.html提供資源的路徑,設定完後找所有的資源都會去當前目錄下找。這種方 法帶有強制性,說明以後找檔案都在js下找
* 將index.html放在dist/js/也可以解決。
八、自動編譯打包(熱載入)
* 利用webpack開發伺服器工具: webpack-dev-server
* 下載
- npm install --save-dev webpack-dev-server
* webpack配置
devServer: {
contentBase: './dist'//webpack-dev-server預設服務於根路徑下index.html,contentBase引導webpack-dev-server指向某一個資料夾下的 index.html
},
* package配置
- "start": "webpack-dev-server --open"
* 編譯打包應用並執行
- npm start
九、使用webpack外掛
* 常用的外掛
* 使用html-webpack-plugin根據模板html生成引入script的頁面
* 使用clean-webpack-plugin清除dist資料夾
* 使用uglifyjs-webpack-plugin壓縮打包的js檔案
* 下載
```
npm install --save-dev html-webpack-plugin clean-webpack-plugin
```
* webpack配置const HtmlWebpackPlugin = require('html-webpack-plugin'); //自動生成html檔案的外掛
const CleanWebpackPlugin = require('clean-webpack-plugin'); //清除之前打包的檔案
plugins: [
new HtmlWebpackPlugin({template: './index.html'}), //根據模板頁面生成一個新的頁面
new CleanWebpackPlugin(['dist']),
]* 建立頁面: index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>webpack test</title>
</head>
<body>
<div id="app"></div>
<!--打包檔案將自動通過script標籤注入到此處-->
</body>
</html>