webpack其實就是一個打包工具。它能夠將各類當下主流的sass,less,tsx,vue,jsx,json甚至png,svg等各類格式的文件轉化爲瀏覽器能夠識別的html,css,js和圖片資源文件。將他們按照各類依賴關係,整合在一塊兒,輸出到一個bundle文件中。javascript
webpack首先本地建立一個webpack-test文件夾,而後打開命令提示符,進入此目錄,執行命令npm init(npm是node.js自帶的一個包管理工具,安裝node.js就會自動安裝npm)。css
用來記錄項目操做流程的package文件有了以後,就要進入正題了,若是以前沒有退命令行的webpack-test目錄的話,執行命令html
npm install --save-dev webpack webpack-cli --registry=https://registry.npm.taobao.org
vue
(--registry=https://registry.npm.taobao.org
)java
這個配置是爲了解決國內用戶下載npm模塊速度慢,以及有時候會下載失敗的可能 安裝webpack和webpack-cli(這兩個插件缺一不可,webpack是打包工具,webpack-cli是處理打包命令的webpack自帶的方便用戶的腳手架) 執行命令成功以後的效果:node
import './styles.css';
function component() {
var element = document.createElement('div');
var button = document.createElement('button');
var br = document.createElement('br');
console.log(_.join(['Hello1', 'providePlugin'], ' '));
button.innerHTML = 'Click me1 lok at the console!';
element.appendChild(br);
element.appendChild(button);
//懶加載,第一次打開頁面的時候不會去加載對應的js資源文件,當觸發事件的時候纔去加載資源文件
// webpackChunkName 這個註釋的做用是命名懶加載的資源文件,不然會按照數字遞增命名
button.onclick = e => import(/* webpackChunkName: "math" */ './math').then(module => {
var print = module.default;
print();
});
return element;
}
document.body.appendChild(component());
複製代碼
console.log(
'The print.js module has loaded! See the network tab in dev tools...'
);
export function square(x) {
return x * x;
}
export function cube(x) {
return x * x * x;
}
export default () => {
console.log('Button Clicked: Here\'s "some text"!');
}
複製代碼
body{
background-color: aquamarine
}
複製代碼
目錄截圖:webpack
接下來咱們經過配置webpack配置文件,而後讓index文件裏面的內容顯示在瀏覽器上。看到這裏,你可能有個疑問:這個目錄下面連個html文件都沒有,它怎麼顯示到瀏覽器上面?假如你看過官網的教程或者其餘社區中的一些一步一步的webpac教程,這個文件夾裏面一開始確實是有html文件的,可是咱們這裏是10分鐘快速上手,就省略了,緣由後面的標題會講。web
const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
module.exports = {
entry: {
index: './src/index.js'
},
output: {
filename: '[name].[hash].js',
path: path.resolve(__dirname, 'dist'),
// publicPath:'/' //這個路徑會用於出口的html文件引入關聯文件的路徑
},
optimization: {
// 提取公用代碼塊,優化打包大小必備
splitChunks: {
cacheGroups: {
commons: {
name: "commons",//公用代碼塊名稱
chunks: "initial",
minChunks: 1
}
}
}
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title: 'Production'
}),
new webpack.ProvidePlugin({
_: 'lodash' //全局變量整個lodash
// join: ['lodash', 'join'] //全局join 所有用lodash裏面的join方法
})
],
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(png|svg|jpg|gif)$/,
use: ['file-loader']
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: ['file-loader']
}
]
}
};
複製代碼
const common = require('./webpack.common.js');
const merge = require('webpack-merge');
const webpack=require('webpack');
module.exports =env => {
// Use env.<YOUR VARIABLE> here:
console.log('來了') // 'local'
console.log('Production: ') // true
return merge(common, {
mode:'development',
devtool: 'inline-source-map',//開啓這個能夠在開發環境中調試代碼
devServer: {
contentBase: "./dist",
compress: true,
port: 3000,
hot:true
},
plugins:[
new webpack.NamedModulesPlugin(),
new webpack.HotModuleReplacementPlugin()//這兩個插件用於開發環境時,修改保存代碼以後頁面自動刷新
]
});
}
複製代碼
const common = require('./webpack.common.js');
const merge = require('webpack-merge');
// const UglifyJsPlugin =require('uglifyjs-webpack-plugin');
module.exports = merge(common, {
devtool: 'source-map',//開啓這個能夠在生產環境中調試代碼
// plugins:[
// new UglifyJsPlugin({ //嘗試了一下代碼壓縮,可是會報錯尚未找到緣由
// sourceMap: false
// })
// ],
mode:'production'
});
複製代碼
"build": "webpack --config webpack.prod.js",
"start": "webpack-dev-server --open --config webpack.dev.js",
複製代碼
此時package.json的完整內容是:npm
{
"name": "wbpack-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --config webpack.prod.js",
"start": "webpack-dev-server --open --config webpack.dev.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.34.0",
"webpack-cli": "^3.3.4"
}
}
複製代碼
通過前面這麼多的鋪墊,終於到了咱們的最主要的打包環節,話很少說,直接開始。json
仍是用命令提示符進入到webpack-test目錄,而後運行命令:
npm run build
複製代碼
(這個命令會告訴webpack
打包工具去執行package.json
裏面的scripts
對象的build
的腳本,也就是說實際執行的是webpack --config webpack.prod.js
) 。
這個命令還有一個問題就是 –config webpack.prod.js
,爲什麼會有這個選項呢,這是由於webpack打包工具會使用webpack.config.js
這個文件看成默認配置文件,咱們若是不想使用這個默認配置文件,可使用--config
這個配置,更改webpack的配置項文件。
下面是運行效果:
這麼一長串東西,一看就是報錯,爲何會報錯呢,是由於代碼裏面的一些依賴項模塊沒有安裝,因此下面咱們來安裝好咱們配置項和代碼裏面各類依賴。
檢查了一下代碼和配置項文件,發現缺乏的模塊,而後咱們執行腳本安裝它們
install --registry=https://registry.npm.taobao.org --save-dev clean-webpack-plugin html-webpack-plugin css-loader file-loader style-loader webpack-merge
上面這段腳本含有-dev
因此會安裝到package.json
文件的devDependencies
屬性中
而下面這段腳本會安裝到dependencies
屬性中
install --registry=https://registry.npm.taobao.org --save lodash
安裝完以後的package.json
文件如今是這樣的:
使用 --save-dev 安裝的 插件,被寫入到 package.json 文件的devDependencies 域裏面去,而使用 --save 安裝的插件,則是被寫入dependencies 區塊裏面去。devDependencies 裏面的插件只用於開發環境,不用於生產環境,dependencies 是須要發佈到生產環境的。
好比咱們寫一個項目要依賴於jQuery,沒有這個包的依賴運行就會報錯,這時候就把這個依賴寫入dependencies ;而咱們使用的一些構建工具好比glup、webpack這些只是在開發中使用的包,上線之後就和他們不要緊了,因此將它寫入devDependencies。
這時候再運行命令npm run build
能夠看到打包成功了,目錄下也多出了打包以後的dist文件夾
最後測試效果:
file:///D:/wbpack-test/dist/index.html
複製代碼
首先在src文件夾下面新增一個printf.js文件
console.log(
'The print.js module has loaded! See the network tab in dev tools...'
);
複製代碼
entry: {
index: './src/index.js',
print:'./src/print.js'
},
output: {
filename: '[name].[hash].js',
path: path.resolve(__dirname, 'dist'),
// publicPath:'/' //這個路徑會用於出口的html文件引入關聯文件的路勁
},
複製代碼
最後運行打包命令:
npm run build
能夠看出,print.js也已經輸出到dist文件夾了。
clean-webpack-plugin
這個插件用來清除生成目錄的緩存文件。
html-webpack-plugin
這個插件用來生成入口html
文件,在這個html裏面自動添加依賴。
Webpack-merge
這個是用來合併webpack配置文件的,爲何不適用object.assign
呢?由於object.assign
這個不能深拷貝。
Webpack.NameModulesPlugin
和webpack.HotModuleReplacementPlugin
這兩個插件一塊兒使用於開發環境,修改保存代碼以後自動刷新頁面