文章目錄
0 簡介
webpack是一個可以將所有腳本、圖片、樣式、資源靜態模塊打包工具,打包模塊化方式的源碼。
webpack
依賴於node,需要先安裝nodejs
和npm
:
$ sudo apt install nodejs
$ sudo apt install npm
npm簡單使用:
npm install [email protected] -g
:安裝webpack.
-g
表示全局安裝,--save-dev
表示局部安裝,開發時依賴,打包後不使用。
1 項目結構
dist
文件夾:存放打包之後的文件src
文件夾:存放項目源文件index.html
: 項目打開的首頁package.json
: 使用npm init
生成,npm包管理配置
2 打包項目
2.1 簡單打包
通過簡單的
$ webpack ./src/main.js ./dist/bundle.js
命令打包源碼,並生成目標代碼bundle.js
.
然後在html文件中直接通過:
<script src="./dist/bundle.js"></script>
引用。
2.2 配置文件打包
創建webpack.config.js
文件進行打包配置:
const path = require('path')
module.exports = {
// 入口: 可以是字符串、數組或對象
entry: './src/main.js',
// 出口:打包後生成的文件信息
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
// 樣式loader,允許將樣式也進行打包
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
}
]
}
}
因爲要將樣式也打包,所以要安裝一些loader模塊:
$ npm install --save-dev css-loader style-loader
然後可以直接通過簡單的:
$ webpack
命令進行打包。
2.3 npm配置打包
在2.2中通過webpack
命令打包時,雖然打包命令已經很簡單了,但如果需要安裝其他模塊時,還要分別手動使用npm install
去安裝各個模塊,還是有些麻煩。
可以通過配置package.json
配置npm依賴以及通過npm腳本去執行webpack命令:
{
"name": "wevpack_demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^3.5.3",
"style-loader": "^1.2.1",
"webpack": "^3.6.0"
}
}
首先執行
$ npm install
安裝所有依賴,然後通過
$ npm run build
進行打包。
注意:通過npm命令執行打包首先會從本地的node_modules/.bin
路徑尋找相應的命令,而直接用webpack
打包是從全局的環境變量中尋找。
3 loader
對於非js的靜態資源,需要使用loader來預處理文件。
使用過程:
- 步驟一:通過
npm
安裝需要使用的loader - 步驟二:在
webpack.config.js
的modules
下進行配置
3.1 樣式loader
要打包css樣式,需要進行以下配置:
首先安裝:
$ npm install --save-dev css-loader style-loader
然後配置:
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
},
]
}
最後導入相關樣式:
// 導入樣式
require('./css/normal.css')
less文件配置:
$ npm install --save-dev less-loader less
修改配置文件:
{
test: /\.less$/,
use: [{
loader: "style-loader" // creates style nodes from JS strings
}, {
loader: "css-loader" // translates CSS into CommonJS
}, {
loader: "less-loader" // compiles Less to CSS
}]
}
3.2 圖片資源
圖片資源屬於文件,主要有url-loader
和file-loader
兩種加載器。
url-loader
配置:
$ npm install --save-dev url-loader
配置文件:
{
test: /\.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 8192
}
}
]
}
圖片小於limit時,對圖片進行base64編碼,如果大於limit,則需要用file-loader
進行加載:
$ npm install --save-dev file-loader
再次打包會在dist
目錄下生成對應圖片文件:
此時圖片並不能正確加載,因爲代碼中引入的是src
目錄下的圖像,所以需要在webpack.config.js
下配置publicPath路徑:
// 出口:打包後生成的文件信息
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: 'dist/' // 使用html模板生成頁面時不需要指定該路徑
},
另外,因爲生成的圖片文件名特別長,且和原圖片名看不出聯繫,可以進行配置修改文件名:
{
loader: 'url-loader',
options: {
limit: 8192,
name: 'img/[name].[hash:8].[ext]'
}
}
3.3 ES6語法處理
有些瀏覽器還不支持ES6,可以通過babel
將ES6轉化爲ES5:
$ npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
配置:
{
// 添加ES6轉ES5 babel-loader
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015']
}
}
}
4 plugins
插件的使用過程:
- 步驟一:通過npm安裝,有些webpack已經內置不用安裝
- 步驟二:在
webpack.config.js
的plugins
中傳入插件實例。
4.1 添加版權的plugin
BannerPlugin
插件是webpack自帶的插件,在webpack.config.js
中進行配置:
const webpack = require('webpack')
module.exports = {
...
plugins: [
new webpack.BannerPlguin('最終版權歸某某所有')
]
}
之後再打包的話,在生成的文件頭部都會生成上面那句話。
4.2 打包html的plugin
一般自己的index.html
文件放在項目根目錄下,在dist
文件夾下沒有該文件,使用HtmlWebpackPlugin
插件可以(指定模板)生成html文件。
先安裝插件:
$ npm install html-webpack-plugin --save-dev
修改配置文件:
const webpack = require('webpack')
module.exports = {
...
plugins: [
new webpack.BannerPlguin('最終版權歸某某所有')
]
}
5 配置vue
首先安裝vue:
$ npm install vue --save
因爲程序在運行時也需要使用vue,所有使用--save
安裝運行時依賴。
在webpack.config.js
的module
同級層進行配置:
resolve: {
extensions: ['.js', '.css', '.vue'],
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
之後就可以進行Vue開發。
5.1 原始vue開發
原始vue開發,主要是區分於.vue文件組件化
開發。這種模式下,主要分爲以下個部分:
js
文件內註冊組件:
// 使用Vue進行開發
import Vue from 'vue'
new Vue({
el: '#app',
template: `
<h2>{{message}}</h2>
`,
data: {
message: 'hhhhhhhhh'
}
})
html
文件內使用組件:
<body>
<div id="app"></div>
<script src="./dist/bundle.js"></script>
</body>
注意:當實例內el
和templage
都存在時,使用組件時會自動用template模板內容替換掉對應el的模板。
5.2 Vue組件化開發
5.2.1 開發環境配置
首先安裝:
$ npm install vue-loader vue-template-compiler --save-dev
修改webpack.config.js
文件:
const path = require('path')
const {VueLoaderPlugin} = require('vue-loader')
module.exports = {
// 入口: 可以是字符串、數組或對象
entry: './src/main.js',
// 出口:打包後生成的文件信息
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: 'dist/'
},
resolve: {
extensions: ['.js', '.css', '.vue'],
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
module: {...
},
plugins: [
// plugin for new vue-loader
new VueLoaderPlugin()
]
}
5.2.2 組件開發
然後就可以開發.vue
組件:
<template>
<!-- 組件的模板 -->
</template>
<script>
export default {
// 組件的構造器對象
name: 'App', // 組件標籤
data() { // 組件data只能是函數
return { // 返回對象
}
}
}
</script>
<style>
// 樣式
</style>
5.2.3 組件使用
<App/>
6 搭建本地服務器
基於node.js搭建,內部使用express框架,實現瀏覽器自動刷新修改結果。
首先安裝:
$ npm install --save-dev [email protected]
在webpack.config.js
的devServer
中進行配置:
devServer: {
contentBase: './dist', // 啓動web項目目錄
inline: true, // 頁面實時刷新
port: 8080 // 監聽端口號
}
在package.json
中配置啓動腳本:
"dev": "webpack-dev-server --open"
之後使用npm run dev
即可啓動本地服務器,進行調試。