【webpack】入門Demo
概述
Webpack 是當下最熱門的前端資源模組化管理和打包工具。它可以將許多鬆散的模組按照依賴和規則打包成符合生產環境部署的前端資源。還可以將按需載入的模組進行程式碼分隔,等到實際需要的時候再非同步載入。通過 loader 的轉換,任何形式的資源都可以視作模組,比如 CommonJs 模組、 AMD 模組、 ES6 模組、CSS、圖片、 JSON、Coffeescript、 LESS 等。
webpack在開發中可以使用 JavaScript 處理你的依賴關係和載入順序,避免意外引入一些你不需要在生產中用上的 CSS 樣式表和 JS 庫,使專案膨脹,或重複載入某些js,css等庫。
使用webpack
初始化專案
mkdir webpack-demo && cd webpack-demo
npm init -y
建立並進入webpack-demo,初始化一個新的專案,並建立package.json檔案,’-y’表示可接受package.json的一對預設值(多個npm使用技巧)
建立目錄結構:
├── src
│ ├── main.js
│ ├── assets
│ │ ├── css
│ │ └── img
├── README.md
├── index.html
├── package.json
├── webpack.config.js
└── yarn.lock
安裝
npm i webpack -D
webpack.config.js
配置資訊
- 入口(entry):告訴webpack打包從哪裡開始
- 輸出(output):如何處理打包程式碼及打包輸出到什麼位置
- 載入器(loaders):通過loader識別出各種資源,將這些檔案轉換為模組
- 外掛(plugins):由於載入器僅基於單個檔案執行轉換,外掛可以做一些更復雜的操作及自定義功能
簡單配置
module.exports = {
entry: `./src/main.js`,
output: {
filename: `./dist/bundle.js`
}
}
執行
webpack
dist目錄下生成bundle.js檔案
webpack其他引數
- webpack -p – 進行優化壓縮處理,相當於設定process.env.NODE_ENV=”production”
- webpack –watch – 持續監聽構建
- webpack -d – debug模式,包含source maps
- webpack –display-error-details – 顯示詳細的打包出錯資訊
- webpack -h 檢視更多的資訊,常見的還有–colors,–progress
- webpack –config XXX.js //使用另一份配置檔案(比如webpack.config2.js)來打包
載入更多資源 –使用loader
栗子:
{
test: /.js$/,
loader: `babel-loader`,
include: path.resolve(__dirname, `src`),
exclude: /node_modules/,
}
loader是比較核心的一塊內容,它將各類靜態資源通過loader轉換為js模組,一個loader包含以下幾部分
test: 一個匹配loaders所處理的檔案的擴充名的正規表示式(必須)
loader: loader的名稱(必須)
include/exclude: 新增必須處理的檔案(資料夾)或遮蔽不需要處理的檔案(資料夾)(可選)
query: 為loaders提供額外的設定選項(可選)
1.ES6語法的js babel-loader
babel-loader安裝相應的包
npm i babel-loader -D
安裝babel-core和babel-preset-es2015,將ES6的程式碼轉換成ES5
npm i babel-core babel-preset-es2015 -D
在module.rules中新增loader節點
module: {
rules: [{
test: /.js$/,
loader: `babel-loader`,
query: {presets: [`es2015`]}
}]
}
- 樣式 css-loader,style-loader
src/assets/css下新建style.css
body {
background-color: #ff0;
}
main.js中引入css資源,會報錯,因為沒有相應的loader進行處理
require(‘./assets/css/style.css’)
新增loader處理
npm i css-loader style-loader -D
{
test: /.css$/,
loader: ‘style-loader!css-loader’
}
在編譯的js程式碼中我們可以看到
/ 4 /
/***/ (function(module, exports, __webpack_require__) {
exports = module.exports = __webpack_require__(1)(undefined);
// imports
// module
exports.push([module.i, “body {
background-color: #ff0;
}
“, “”]);
// exports
/***/ }),
- 圖片 file-loader url-loader
url-loader是對file-loader的封裝
npm i file-loader url-loader -D
{test: /.(png|jpg)$/, loader: “url-loader?limit=8192”}
這樣會將小於8kb的圖片直接以base64的格式內嵌到程式碼中,在一定程度上減少小圖片的請求
main.js中新增程式碼
let img1 = document.createElement(`img`)
img1.src = require(`./assets/img/icon.png`)
document.body.appendChild(img1)
更多的loaders:http://webpack.github.io/docs/list-of-loaders.html
啟一個服務webpack-dev-server
dist下新建index.html
<!DOCTYPE html>
<html>
<head>
<title>webpack demo page</title>
</head>
<body>
<script src=”/dist/bundle.js”></script>
</body>
</html>
安裝相應的包
npm i webpack-dev-server -D
model下新增配置
devServer: {
contentBase: path.join(__dirname, `dist`),
compress: false,
inline: true,
port: 8080
}
執行
node_modules/.bin/webpack-dev-server
開啟 http://127.0.0.1:8080/ 頁面變為×××
我們可以將這個指令碼放在package.json中
“scripts”: {
“start”: “node_modules/.bin/webpack”,
“serve”: “node_modules/.bin/webpack-dev-server”
}
這樣我們可以直接執行
npm run serve
加入程式守護nodemon
“scripts”: {
“start”: “nodemon –exec webpack -w webpack.config.js”,
“serve:watch”: “nodemon –exec webpack-dev-server -w webpack.config.js”
}
頁面實時重新整理 Hot Module Replacement(HMR) 熱載入
It’s like LiveReload for every module.
當模組發生變化時,記憶體中的bundle會收到通知,如果不影響到整個頁面的變化,只會重新整理區域性,而不用重新整理整個頁面。
設定hot為true
devServer: {
contentBase: path.join(__dirname, “),
compress: true,
inline: true,
hot: true, **
port: 8080
},
2.新增到pligins中
plugins: [
new webpack.HotModuleReplacementPlugin() //熱載入外掛
],
chrome控制檯開啟我們可以看到,說明HMR已經開啟
[HMR] Waiting for update signal from WDS…
[WDS] Hot Module Replacement enabled.
附:webpack修改每次都重啟?nodemon守護
nodemon程式守護,用來監控你node.js原始碼的任何變化,自動重啟服務
npm i nodemon -g
nodemon – -exec webpack -w webpack.config.js
這裡我們只需要監聽webpack.config.js檔案的變化,所以新增-w引數指定特定的目錄或者檔案
進階
目錄結構
├── src
│ ├── main.js –主入口
│ ├── assets
│ │ ├── css
│ │ └── img
│ ├── libs
│ │ └── util.js –公共方法
│ ├── modules
│ │ ├── login.js –登入頁面
│ │ └── product.js –商品頁面
├── README.md
├── index.html
├── package.json
├── webpack.config.js
└── yarn.lock
- 多頁應用
entry的配置我們可以是string,object,array型別,前面的例子用到的是string,單個入口,現在我們新增了幾個目錄及檔案
entry: {
main: `./src/main.js`,
login: `./src/modules/login.js`,
product: `./src/modules/product.js`
}
上面的入口檔案都在src目錄下,那麼可以設定一個基礎目錄,絕對路徑,用於從配置中解析入口起點(entry point)和載入器(loader)
context
The base directory (absolute path!) for resolving the entry option. If output.pathinfo is set, the included pathinfo is shortened to this directory.
入口檔案的基礎目錄(絕對路徑!)。如果output.pathinfo設定,值為到該目錄的路徑。
更多webpack基礎配置
context: path.resolve(__dirname, `src`),
entry: {
main: `./main.js`,
login: `./modules/login.js`,
product: `./modules/product.js`
}
如果是陣列,那麼會將陣列中的模組合併,並且輸出最後一個;如果是object,那麼多個入口的key會打包成包的chunk名稱。
output: {
path: path.join(__dirname, `dist`),
publicPath: `/`,
filename: `[name]-[hash:8].js`,
chunkFilename: `[id]-[chunkhash].js`
}
跑webpack會看到dist下生成login-5ccbce5e.js,main-5ccbce5e.js,product-5ccbce5e.js三個檔案
- 省略副檔名?resolve.extensions
可以直接寫util,而不用util.js, vue檔案也可以省略檔名
resolve: {
extensions: [“, `.js`, `.vue`]
}
-
檔案查詢的路徑太長?resolve.alias縮減引用路徑
resolve: {
extensions: [`.js`, `.css`] ,
alias: {
`libs`: path.resolve(__dirname, `src/libs`),
`react`: `node_modules/react/react.js`
}
這樣在src下的任何js檔案都可以直接這樣引入模組,而不用../libs/util
import { ajax } from ‘libs/util’
自動引入vue/jquery ?ProvidePlugin
自動載入模組,ProvidePlugin可以讓我們無需引入的情況下,以全域性的模式直接使用模組變數
new webpack.ProvidePlugin({
Vue: ‘Vue’
})
程式碼中可以不用引入vue直接使用vue
原地址:http://blog.csdn.net/Doris_rain/article/details/77942604
相關文章
- Webpack 入門Web
- 入門WebpackWeb
- FastDFS入門小DemoAST
- Redux 入門 Demo:TodoListRedux
- Webpack快速入門Web
- Webpack 入門教程Web
- webpack 4 入門Web
- FreeMarker 之快速入門Demo
- 入門Leaflet之小Demo
- Dubbo的入門小Demo
- webpack 基礎入門 - 瞭解webpackWeb
- 新手入門,webpack入門詳細教程Web
- webpack4入門Web
- webpack 快速入門 系列 —— 初步認識 webpackWeb
- egg 自學入門demo分享
- webpack4.0入個門Web
- webpack 入門之 loader 案例Web
- webpack 快速入門 系列 —— 效能Web
- MyBatis(二)MyBatis入門程式(MyBatis demo)MyBatis
- Webpack修煉日誌——入門Web
- [WebAssembly 入門] 與 Webpack 聯動Web
- webpack入門筆記——其他配置Web筆記
- Webpack入門以及打包優化Web優化
- webpack從入門到放棄Web
- webpack 5.x 快速入門Web
- JavaCPP快速入門(官方demo增強版)Java
- 【webpack系列】webpack4.x入門配置基礎(一)Web
- webpack入門學習手記(三)Web
- webpack入門學習手記(一)Web
- webpack入門學習手記(二)Web
- webpack4入門筆記——loaderWeb筆記
- webpack入門筆記——熱替換Web筆記
- webpack自動化架構入門Web架構
- webpack 從入門到放棄(一)Web
- webpack入門學習手記(四)Web
- Webpack輕鬆入門(四)——HTML打包WebHTML
- webpack 快速入門 系列 —— 實戰一Web
- 2018超直白入門demo:IDEA+Maven+MyBatisIdeaMavenMyBatis
- 適合新手入門Spring Security With JWT的demoSpringJWT