webpack的那些事兒

無論是vue-cli仍是react-sprite,其實都是基於webpack實現的。試想,若是沒有腳手架,你本身能搭一個嗎?看完這篇博客,讓你明白webpak都有些什麼東西 

 webpack其實沒有那麼神奇,就是一個打包工具,並且它自己只能打包js,而圖片,css,html其實都是依靠它的loader和plugin完成的。 

webpack.config.js文件,看名字就知道它是webpack的配置文件。該文件通常包括:入口entry,出口output,loader和插件pluginjavascript

const path = require('path')
module.exports = {
  mode: 'development',
  entry: './src/1.js',
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: 'bundle.js'  },
  module: {
    rules: [{
      test: /\.css$/,
      use: ['style-loader', 'css-loader', 'postcss-loader']
    }]
  }}複製代碼

來解析下上面的代碼,css

第一行的path實際上是node的核心模塊,webpack其實就是基於node的產物,你的電腦要是沒有node,你也裝不了webpack的。 html

接下來會向外暴露: vue

mode能夠指定是development環境仍是production環境。腳手架沒有這一項,由於它已經分了dev.conf.js和prod.conf.js。 java

entry指定你要打包的入口文件,node

output指定你要打包到哪和打包文件的名字。react

module模塊通常用來設置你代碼中要打包的css,圖片之類的loader。webpack

上面就是解析css的loader,確定有人好奇爲何會有三個: web

style-loader:將會建立style標籤,將樣式放到頁面中 vue-cli

css-loader:將css代碼轉成js能接受的字符串 

post-loader:尋找那些須要瀏覽器兼容加前綴的樣式,好比-webkit-,你沒加,但loader會幫你補全,是否是很省心。這個loader有點不同的是他依賴一個autoprefixer的配置文件。

這也就能解釋爲何你的項目中引入less,sass之類的擴展語言要寫三個loader。  

注意:這三個loader的順序不能錯,loader是從右往左執行的。 接下來的devtool不是必須的,他會保留代碼編譯前的模樣,方便調式,上線必定要關掉,否則會讓你打包的大小增大不少。  

本身配置一個webpack:


上面的build裏的bundle.js就是打包後生成的文件。webpack.config.js就是上面的代碼,postcss.config.js就是postcss-loader須要的配置文件

//1.js
import '../css/1.css'
console.log(111)複製代碼

//postcss.config.js
const autoprefixer = require('autoprefixer')
module.exports = {  plugins: [    autoprefixer  ]}複製代碼

//1.css
#div1 {
  width: 200px;
  height: 200px;
  transition: 1s all ease;
  background-color: rgb(148, 148, 148);
}
#div1:hover {
  transform: rotateY(60deg)
}複製代碼

此時,在命令行中運行webpack,就會生成上面的build文件夾,打開index.html,你會發現,這就是咱們本身寫的css和js。這樣就完成了打包,是否是很簡單?

咱們可能還會好奇webpack爲何可以起一個服務環境,實現熱更新等功能,這就不能不說webpack-dev-server了。

實現熱更新:

這個不須要咱們配置,但須要依賴,因此咱們要:

npm i webpack webpack-cli webpack-dev-server複製代碼

注意:這裏的啓動命令要在package.json文件裏配置

{  
"scripts": { 
   "dev": "webpack-dev-server --progress --hot",  
},  
"devDependencies": {
    "autoprefixer": "^9.5.1",
    "css-loader": "^2.1.1", 
   "postcss-loader": "^3.0.0",
    "style-loader": "^0.23.1",
    "webpack": "^4.31.0",
    "webpack-cli": "^3.3.2",
    "webpack-dev-server": "^3.3.1"
  }}複製代碼

此時,你在命令行輸入npm run dev,會發現你的項目已經監聽8080端口啦


若是要配置webpack-dev-server,也能夠在webpack.config.js中進行配置:

devServer:{
    hot: true,        //設置熱更新
    host: 'localhost', //可選,ip
    port: 3000, //可選,端口
    contentBase:path.resolve(__dirname,'build'), //可選,基本目錄結構
    compress: true, //可選,壓縮    proxy: {
        '/api': {
            target: 'http://localhost:8081',
            pathRewrite: {'^/api': '/data'} 
//原本是反向代理去http://localhost:8081/api,rewrite以後就反向代理去http://localhost:8081/data
        }
    }}複製代碼

到目前爲止,咱們生成的index.html文件其實仍是本地文件,那麼咱們如何生成一個服務器訪問的html文件呢?這裏就要引入html-wepack-plugin插件了。

npm i html-webpack-plugin -S複製代碼

plugins: [
    new HtmlWebpackPlugin({
      template: './build/index.html'
    }),    
new webpack.HotModuleReplacementPlugin({})
  ]}複製代碼

這裏我把我build文件夾下的index.html。

到這裏,一個小小的腳手架雛形其實就有了。剩下的就是配置各類各樣的loader啦

由於loader的配置都是大同小異,這裏就不作過多介紹。

具體能夠戳這裏www.webpackjs.com/loaders/

附上完整的webpack.config.js

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  mode: 'development',  entry: './src/1.js',
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: 'bundle.js'  
},  
module: {
    rules: [
        { test: /\.css$/,      use: ['style-loader', 'css-loader', 'postcss-loader']    }
    ]
  },
  devServer: {
    host: 'localhost', //可選,ip
    port: 3000, //可選,端口
    contentBase: path.resolve(__dirname, 'build'), //可選,基本目錄結構
    compress: true, //可選,壓縮 hot: true },
  plugins: [
    new HtmlWebpackPlugin({
      template: './build/index.html'
    }),
    new webpack.HotModuleReplacementPlugin({})
  ]}複製代碼
相關文章
相關標籤/搜索