webpack4實操筆記

webpack

webpack是模塊化管理工具,使用webpack能夠對模塊進行壓縮、預處理、按需打包、按需加載等
四個核心概念
入口entry
入口起點指webpack應該使用哪一個模塊,來做爲構建其內部依賴圖的開始。進入入口起點後,webpack會找出有哪些模塊和庫是入口起點(直接和間接)依賴的。
輸出output
告訴 webpack 在哪裏輸出它所建立的 bundles,以及如何命名這些文件,默認值爲 ./dist。整個應用程序結構,都會被編譯到你指定的輸出路徑的文件夾中。
loader
loader 讓 webpack 可以去處理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 能夠將全部類型的文件轉換爲 webpack 可以處理的有效模塊,而後你就能夠利用 webpack 的打包能力,對它們進行處理。
插件plugins
插件的範圍包括,從打包優化和壓縮,一直到從新定義環境中的變量。插件接口功能極其強大,能夠用來處理各類各樣的任務。

搭建環境及配置

基本框架

全局安裝
#全局安裝 ( MAC 須要在 npm 前加 sodu )
npm install webpack -g
#全局安裝webpack命令行接口
npm install webpack-cli -g
#全局安裝一個小型的Node.js Express服務器
npm install webpack-dev-server -g
複製代碼
文件夾
#生成src文件夾
mkdir src config dist
複製代碼
初始化
#初始化一個本地倉庫,方便後期將代碼上傳到gitHub上
git init
#初始化(生成package.json)
npm init -y
複製代碼
文件夾/文件
touch src/index.js dist/index.html
複製代碼

環境

#打包自動生成dist文件夾,以及dist下main.js文件(mode是webpack4獨有)
##開發環境下
webpack --mode=development
##生產環境下
webpack --mode=production
複製代碼
局部安裝
#局部安裝(安裝到開發環境)
npm install webpack webpack-cli webpack-dev-server
複製代碼

配置

基礎配置
touch config/webpack.dev.js
rm dist/main.js src/index.js
touch src/main.js
複製代碼
#config/webpack.dev.js
const path = require("path")
module.exports = {
    //入口(一個或多個)
    entry:{
        //main:["other.js","./src/main.js"]
        main:"./src/main.js"
    },
    //打包環境:development & production
    mode:"development",
    //出口只有一個
    output:{
        filename: "[name].bundle.js",
        path: path.resolve(__dirname,"../dist"),
        //根路徑
        publicPath: "/"
    }
}
複製代碼
#打包
webpack --config=config/webpack.dev.js
#啓動服務(Project is running at http://localhost:8080/)
webpack-dev-server --config=config/webpack.dev.js
複製代碼
配置package.json簡化命令行
"start":"webpack-dev-server --config=config/webpack.dev.js",
"build":"webpack --config=config/webpack.dev.js"
# package.json
{
  "name": "mingx",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "dependencies": {
    "webpack": "^4.8.3",
    "webpack-cli": "^2.1.4",
    "webpack-dev-server": "^3.1.4"
  },
  "devDependencies": {},
  "scripts": {
    "start":"webpack-dev-server --config=config/webpack.dev.js",
    "build":"webpack --config=config/webpack.dev.js"
  },
  "author": "",
  "license": "ISC"
}
複製代碼
#重啓
 npm start
 #打包
 npm run build
複製代碼

配置本地服務器(設置默認頁面爲dist裏面的內容)
#config/webpack.dev.js
devServer:{
    contentBase:"dist"
}
複製代碼

加載CSS

#生成一個css文件
touch src/main.css
複製代碼
# dist/index.html
<div>hello</div>
<script src="main.bundle.js"></script>

#src/main.css
body{background-color:blueviolet;color:#fff;}

# src/main.js(引入css文件)
require("./main.css")
複製代碼

下載css加載器

npm install style-loader css-loader
複製代碼

配置css loaders

#config/webpack.dev.js
module:{
    rules:[
        //css loaders
        {
            test:/\.css$/,
            use:["style-loader","css-loader"]
        }
    ]
}
複製代碼
從新啓動(只要webpack.config.js文檔有變更就須要重啓,並刷新頁面)
npm start

錯誤信息反饋到終端

將錯誤信息同步到http://localhost:8080/頁面(webapck.dev.js文檔devServer裏面添加overlay:true)
#config/webpack.dev.js
devServer:{
    contentBase:"dist",
    overlay:true
}
複製代碼

加載html

#將dist文件夾下的index.html,引入src中
mv dist/index.html src/
複製代碼
# src/main.js
require("./main.css")
require("./index.html")
複製代碼

1.下載html加載器

npm install html-loader extract-loader file-loader
複製代碼

2.配置html loaders

# webpack.dev.js
{
    test:/\.html$/,
    use:["file-loader?name=[name].html","extract-loader","html-loader"]
    //使用順序從後往前
    //1.html-loader找到html文件
    //2.extract-loader將index.html跟生成的bundle.js進行分割
    //3.file-loader爲加載的文件起名字
}
##另外的的編譯方式
{
    test:/\.html$/,
    use: [
        {
            loader: "file-loader",
            option: {
                name: "[name].html"
            }
        },
        {
            loader: "extract-loader"
        },
        {
            loader: "html-loader"
        }
    ]
}
複製代碼
#刪除dist裏面的文件
rm -rf dist/main.bundle.js dist/index.bundle.html
複製代碼

3.打包、重啓

npm run build 
npm start
複製代碼

加載器圖片

#生成
mkdir src/images
複製代碼

1.下載url加載器

npm install url-loader 
複製代碼

2.配置image loaders

#webpack.dev.js
{
    //匹配到.jpg|png|svg|gif結尾的文件
    test:/\.(jpg|png|svg|gif)$/,
    //多個loader須要從後到前進行解析(大於10kb打包)
    use:["url-loader?limit=10&name=images/[name]-[hash:8].[ext]"]
}
複製代碼

3.打包、重啓

加載JS

使用babel轉換JS

# src/main.js 
var a = () => {
    console.log("one more time")
}
複製代碼

下載

#安裝babel-core
npm install babel-core
#生成.babelrc文件( babelrc文件的本質是json ,rc爲自動加載的文件)
touch .babelrc
#下載庫,將ES6轉爲ES5
npm install babel-plugin-transform-es2015-arrow-functions
複製代碼
配置.babelrc 文件
#.babelrc
{
    "plugins":[
        "transform-es2015-arrow-functions"
    ]
}
複製代碼
#安裝babel
sudo npm install babel-cli -g
#main.js使用babel
babel src/main.js
複製代碼

ES6轉爲ES5

#安裝babel-loader
npm install babel-loader
複製代碼

配置JS loaders

# webpack.dev.js
{
    test:/\.js$/,
    use:["babel-loader"],
    //排除node_modules中的JS文件
    exclude:/node_modules/
}
複製代碼
#刪除dist裏面的文件
rm -rf dist/main-bundle.js dist/index.html dist/images
#從新啓動、打包
npm start
npm run build
複製代碼
查看dist/main.bundle.js (中有ES6被解析爲ES5)

更好的解決JS語法:polyfill / preset / transform

# src/main.js
var a = async () => {
    await console.log("one more time");
    console.log('two')
}

#.babelrc 
{
    "plugins":[
        "transform-es2015-arrow-functions",
        "async-to-promises"
    ]
}
複製代碼
#將async轉爲promise
npm install babel-plugin-async-to-promises
#main.js使用babel
babel src/main.js
複製代碼

polyfill會在預編譯以前編譯指定的東西(缺點:生成環境變量的污染)
#安裝polyfill
npm install babel-polyfill
複製代碼

配置JS loaders

# webpack.dev.js
entry:{
    main:["babel-polyfill","./src/main.js"]
}
複製代碼
babel-polyfill中選擇對應的內容轉化指定的語法(觀察main.bundel.js的大小)
entry:{
    main:["core-js/fn/promise","./src/main.js"]
},
複製代碼
#比polyfill更好的方式:安裝環境變量
npm install babel-preset-env
複製代碼
#.babelrc
{
   "presets":[
       "env",
       {
           "debug":true
       }
   ]
}
複製代碼

#.babelrc
{
   "presets":[
       [
            #配置環境自動下載對應的插件
            "env",
            {
                "tartgets":{
                #配置瀏覽器的版本號
                    "browsers":["last 2 versions"]
                },
                "debug":true
            }
       ]
   ],
   "plugins":[
        #識別最新語法,解決環境污染
        "transform-runtime"
    ]
}
複製代碼
#安裝插件:transform-runtime
npm install babel-plugin-transform-runtime
複製代碼
# main.js
require("babel-runtime/regenerator")
require("./main.css")
require("./index.html")
var a = async args  => {
    const {a, b} = args
    await console.log("one more time", a, b);
    console.log('two')
}
a({a:12,b:23});
複製代碼
#main.js使用babel
babel src/main.js  
複製代碼

搭建腳手架

實時報錯、服務端和客戶端實時渲染...
#安裝express
npm install express
#建立server文件夾用於啓動服務
mkdir src/server
#建立入口文件和配置服務器的文件
touch src/server/main.js src/server/express.js
複製代碼
# package.json添加dev(用node啓動main.js )
"dev":"node src/server/main.js"

# src/server/main.js
//將ES6轉爲ES5
require("babel-register")
//執行express文件
require("./express")

# src/server/express.js
//啓動一個服務器
import express from 'express';
import path from 'path';
//建立服務器
const server = express()
//監聽端口號 8080
server.listen(8080,() => {
    console.log("server is running...")
})
複製代碼
配置服務啓動頁面
#監聽代碼
npm install webpack-dev-middleware
複製代碼
# src/server/express.js
//啓動一個服務器
import express from 'express';
import path from 'path';

//建立服務器
const server = express()
//配置啓動路徑
const staticMiddleware = express.static("dist")
//監聽代碼
const webpack = require("webpack")
const config = require("../../webpack.dev")
//使用webpack把config傳進去做爲實例
const compiler = webpack(config)
//使用下載的webpack-dev-middleware
const webpackDevMiddleware = require("webpack-dev-middleware")(compiler,config.devServer)
//【運行】server
server.use(webpackDevMiddleware)
// 【使用路徑】
server.use(staticMiddleware)
//監聽端口號 8080
server.listen(8080,() => {
    console.log("server is running...")
})
複製代碼
npm run dev

前端熱更新

#配置熱更新
npm install webpack-hot-middleware    
複製代碼
# src/server/express.js //【使用熱更新】在【運行】以後,【使用路徑】以前

//熱更新
const webpackHotMiddleware = require("webpack-hot-middleware")(compiler)
//【使用熱更新】
server.use(webpackHotMiddleware)
複製代碼
配置熱更新
# webpack.dev.js
//引入webpack
const webpack = require('webpack');
//添加
module.exports = {
    devServer:{
        //熱更新
        hot:true,
    },
    //插件
    plugins:[
        new webpack.HotModuleReplacementPlugin()
    ]
」
# src/main.js
require("webpack-hot-middleware/client")
複製代碼

後端熱更新

#安裝全局的nodemon進行監聽(後端)
sudo npm install nodemon -g
複製代碼
配置監聽
#package.json
"dev":"nodemon --watch config --watch src/server src/server/main.js" 
複製代碼

服務端熱更新

#服務端監聽,安裝插件
npm install html-webpack-plugin
複製代碼
配置後端熱更新
# webpack.dev.js
//引入html-webpack-plugin,而且生成實例
const HTMLWebpackPlugin = require("html-webpack-plugin");
//更改html loaders,去除和"html-webpack-plugin"插件功能中相同的部分
{
    test: /\.html$/,
    use:["html-loader"]
}
//插件
plugins:[
        new webpack.HotModuleReplacementPlugin(),
        //添加插件HTMLWebpackPlugin
        new HTMLWebpackPlugin({
            template:"./src/index.html"
        })
    ]

# src/main.js
require("webpack-hot-middleware/client?reload=true")
複製代碼
優化熱更新重複編譯和動態建立文件的問題
npm install webpack-mild-compile
複製代碼
# src/server/express.js 
require("webpack-mild-compile")
複製代碼

藉助webpack、node.js、瀏覽器實現調試

#package.json
"dev":"nodemon --inspect --watch config --watch src/server src/server/main.js 複製代碼
問題:[nodemon] app crashed - waiting for file changes before starting...
解決:我憑藉直覺改了src/server/express.js裏面監聽的端口路徑-_-!
以上代碼地址:github.com/kiwi677/web…

React

npm install react react-dom
#建立react入口文件
touch src/app.js
複製代碼
#src/main.js
//引入babel文件解析ES6
require("babel-register");
//引入將react入口文件
require("./app");

#src/index.html
//添加根目錄
<div id="react-root"></div>

#src/app.js
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
    <h1>Hi kiwi</h1>,
    document.getElementById("react-root")
)
複製代碼

解析jsx

下載babel-preset-react
npm install babel-preset-react
複製代碼
配置babel-preset-react
#.babelrc
{
    "presets":[
        [
             "env",
             {
                 "tartgets":{
                     "browsers":["last 2 versions"]
                 },
                 "debug":true
             }
        ],
        "babel-preset-react"
    ],
    "plugins":[
         "transform-runtime"
     ]
 }
複製代碼
npm run dev    
複製代碼

Sass

npm install node-sass sass-loader
touch src/main.sass
複製代碼
# main.js
require("./main.sass")

#config/webpack.dev.js
//sass
{
    test: /\.sass$/,
    use: ["style-loader", "css-loader","sass-loader"]
}
複製代碼
代碼地址:github.com/kiwi677/web…

jQuery

npm install jquery
複製代碼
#config/webpack.dev.js
plugins: [
    new webpack.ProvidePlugin({
        $: "jquery",
        jQuery: "jquery"
    })
]
複製代碼

Bootstrap

npm install bootstrap
複製代碼
# main.js
import 'bootstrap/dist/css/bootstrap.css'
//須要先安裝jquery 和 popper.js
import 'bootstrap/dist/js/bootstrap.js'
複製代碼
npm install popper.js
複製代碼
#config/webpack.dev.js
plugins: [
    new webpack.ProvidePlugin({
    new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
            'window.jQuery': 'jquery',
            Popper: ['popper.js', 'default']
        })
]
複製代碼
jQuery + Bootstrap代碼地址:github.com/kiwi677/web…
相關文章
相關標籤/搜索