Webpack初探

Webpack是什么

Webpack是一种前端资源构建工具,一个静态模块打包器(module bundler)。在Webpack看来,前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。


在这里插入图片描述

Webpack 五个核心概念

Entry

入口(Entry)指示Webpack以哪个文件为入口起点开始打包,分析构建内部依赖图。

Output

输出(Output)指示Webpack打包后的资源bundles输出到哪里去,以及如何命名。

Loader

Loader让Webpack能够去处理那些非JavaScript文件(Webpack自身只能理解JavaScript)。

Plugins

插件(Plugins)可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。

Mode

模式(Mode)指示Webpack使用相应模式的配置。


在这里插入图片描述

Webpack初试

  1. 新建pacakge.json文件
    npm init
  2. 安装webpack和webpack-cli
    npm install webpack webpack-cli -D
 -S
即--save(保存)
包名会被注册在package.json的dependencies里面,在生产环境下这个包的依赖依然存在

-D
即--dev(生产)
包名会被注册在package.json的devDependencies里面,仅在开发环境下存在的包用-D,如babel,sass-loader这些解析器
  1. 通过webpack打包文件
/*index.js文件*/

import data from './data.json';
console.log(data);


function  add(x,y) {
    return x + y;
}
console.log(add(1,2));
/*data.json文件*/

{
  "name": "Cecilia",
  "age": 20
}

在控制台输入(二者其一):
webpack ./src/index.js -o ./build/built.js --mode=development
webpack ./src/index.js -o ./build/built.js --mode=production
控制台将打印:

{ name: 'Cecilia', age: 20 }
3
index.js: webpack入口起点文件
1.运行指令:
    开发环境:webpack ./src/index.js -o ./build/built.js --mode=development
        webpack会以./src/index.js为入口文件开始打包,打包后输出到./build/built.js
        整体打包环境是开发环境
    生产环境:webpack ./src/index.js -o ./build/built.js --mode=production
        webpack会以./src/index.js为入口文件开始打包,打包后输出到./build/built.js
        整体打包环境是生产环境

2.结论:
    1.webpack能处理js/json资源,不能处理css/img等其他资源
    2.生产环境和开发环境将ES6模块化编译成浏览器能识别的模块化
    3.生产环境比开发环境多一个js压缩代码

Webpack基本配置

配置webpack.config.js文件
webpack.config.js ----- webpack的配置文件
作用:指示webpack干哪些活(当你运行webpack指令时,会加载里面的配置)。
所有构建工具都是基于nodejs平台运行的,模块化默认采用commonjs。

//resolve用来拼接绝对路径的方法
const { resolve } = require('path');

module.exports = {
    //webpack配置
    //入口起点
    entry: './src/index.js',
    //输出
    output: {
        //输出文件名
        filename: 'built.js',
        //输出路径
        //__dirname是nodejs的变量,代表当先文件的目录绝对路径
        path: resolve(__dirname, 'build')
    },
    //loader的配置
    module: {
        rules: [
            //详细loader配置
        ]
    },
    //plugins的配置
    plugins: [
        //详细plugins配置
    ],
    //模式
    mode: 'development'     //开发模式
    // mode: 'production'
};

打包样式资源

  1. 在src目录下新建css和less文件:
/*index.css文件*/
html,body{
    margin: 0;
    padding: 0;
    height: 100%;
    background-color: pink;
}
/*index.less文件*/
#title {
  color: #ffffff;
}
  1. 配置webpack.config.js文件:
/*webpack.config.js文件*/

const { resolve } = require('path');

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'built.js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            //不同文件必须配置不同loader处理
            {
                //匹配哪些文件
                test: /\.css$/,
                //使用哪些loader进行处理
                use: [
                    //use数组中loader执行顺序:从右到左,从上到下依次执行
                    //创建style标签,将js中的样式资源插入进行,添加到head中生效
                    'style-loader',
                    //将css文件变成commonjs模块加载到js中,里面内容是样式字符串
                    'css-loader'
                ]
            },
            {
                test: /\.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    //将less文件编译成css文件
                    //需要下载less-loader和less两个包
                    'less-loader'
                ]
            }
        ]
    },
    plugins: [
        //详细plugins配置
    ],
    mode: 'development'
};
  1. 下载相关包:
    npm install style-loader css-loader less-loader less -D
  2. 在index.js文件中引入样式资源:
/*index.js文件*/

//引入样式资源
import './index.css';
import './index.less';
  1. 输入打包命令:
    webpack
  2. 在bulid目录下生产打包后的bulit.js文件
  3. 在html文件中引入打包后的js文件:
<!--index.html文件-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
<!--    引入打包后的js文件-->
    <script src="built.js"></script>
    <h1 id="title">hello webpack</h1>
</body>
</html>

打包html资源

  1. 在src目录下新建index.html文件和index.js文件:
<!--src/index.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
    <h1 id="title">hello html</h1>
</body>
</html>
/*src/index.js*/

function add(x,y) {
    return x + y;
}
console.log(add(2,3));
  1. 配置webpack.config.js文件:
/*webpack.config.js文件*/

/*
loader:1.下载     2.使用(配置loader)
plugins:1.下载    2.引入    3.使用
 */

const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        filename: "built.js",
        path: resolve(__dirname, 'build')
    },
    loader: {
        rules: [
            //详细loader配置
        ]
    },
    plugins: [
        //html-webpack-plugin
        //功能:默认会创建一个空的HTML文件,自动引入打包输出所有的资源(JS/CSS)
        //需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
            //复制"./src/index.html"文件,并自动引入打包输出所有的资源(JS/CSS)
            template: "./src/index.html"
        })
    ],
    mode: "development"
};
  1. 下载相关包:
    npm install html-webpack-plugin -D
  2. 输入打包命令:
    webpack
  3. 在bulid目录下生成打包后的bulit.js文件,并创建index.html文件,自动将所有打包输出的资源引入该html文件中。
<!--bulid/index.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
    <h1 id="title">hello html</h1>
<script src="built.js"></script></body>
</html>

在该html文件中,会显示打包后的html资源,也会显示js资源(即在控制台打印5)。
注意:使用html-webpack-plugin插件会自动引入所有资源,不需要自己再引入,避免重复引入。

打包图片资源

  1. 在src目录下新建index.html和index.less文件:
<!--src/index.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
    <div id="box1"></div>
    <div id="box2"></div>
    <div id="box3"></div>
    <img src="img/react.jpg" alt="react">
</body>
</html>
/*src/index.less*/

#box1{
  width: 100px;
  height: 100px;
  background-image: url("img/angular.jpg");
  background-repeat: no-repeat;
  background-size: 100% 100%;
}
#box2{
  width: 200px;
  height: 200px;
  background-image: url("img/vue.jpg");
  background-repeat: no-repeat;
  background-size: 100% 100%;
}
#box3{
  width: 300px;
  height: 300px;
  background-image: url("img/react.jpg");
  background-repeat: no-repeat;
  background-size: 100% 100%;
}
  1. 在src目录下新建index.js文件,引入样式资源:
/*src/index.js*/

import './index.less';
  1. 配置webpack.config.js文件:
/*webpack.config.js*/

const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        filename: "built.js",
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.less$/,
                //使用多个loader处理用use
                use: ['style-loader', 'css-loader', 'less-loader']
            },
            {
                //问题:默认处理不了html中img标签引入的图片
                //处理图片资源
                test: /\.(jpg|png|gif)$/,
                //使用一个loader
                //下载url-loader file-loader
                loader: 'url-loader',
                options: {
                    //图片大小小于8kb,就会被base64处理
                    //优点:减少请求数量(减轻服务器压力)
                    //缺点:图片体积会更大(文件请求速度更慢)
                    limit: 8 * 1024,
                    //问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
                    //解析时会出问题:[object Module]
                    //解决:关闭url-loader的es6模块化,使用commonjs解析
                    esModule: false,
                    //给图片进行重命名
                    //[hash:10]取图片的hash的前10位
                    //[ext]取原来文件扩展名
                    name: '[hash:10].[ext]'
                }
            },
            {
                test: /\.html$/,
                //处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
                loader: 'html-loader'
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html"
        })
    ],
    mode: "development"
};
  1. 下载相关包:
    npm install url-loader file-loader html-loader -D
  2. 输入打包命令:
    webpack
  3. 在build目录下生成打包后的built.js文件,并生成新的index.html文件,将built.js引入。
<!--bulid/index.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
    <div id="box1"></div>
    <div id="box2"></div>
    <div id="box3"></div>
    <img src="4454005113.jpg" alt="react">
<script src="built.js"></script></body>
</html>

关于limit: 8 * 1024

在这里插入图片描述

只有两张图片被打包(小于8kb)
在这里插入图片描述

尝试的时候打包了两次,第二次以hash前十位重命名,生成了两次文件
name: '[hash:10].[ext]'
在这里插入图片描述

小于8kb的图片被base64压缩为字符串格式
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

打包其他资源

  1. 将iconfont所需资源下载到本地,引入src目录下:


    在这里插入图片描述
  2. 在src目录下新建index.html,使用iconfont:
<!--src/index.html-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack</title>
</head>
<body>
    <span class="iconfont .icon-icon-test"></span>
    <span class="iconfont .icon-icon-test1"></span>
    <span class="iconfont .icon-icon-test2"></span>
    <span class="iconfont .icon-icon-test3"></span>
    <span class="iconfont .icon-icon-test4"></span>
    <span class="iconfont .icon-icon-test5"></span>
    <span class="iconfont .icon-icon-test6"></span>
</body>
</html>
  1. 在src目录下新建index.js文件,并引入iconfont样式文件:
/*src/index.js*/

//引入iconfont样式文件
import './iconfont.css';
  1. 配置webpack.config.js文件:
/*webpack.config.js*/

const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        filename: "built.js",
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader','css-loader']
            },
            //打包其他资源(除了html/js/css/less资源以外的资源)
            {
                //排除css/html/js/less资源
                exclude: /\.(css|html|js|less)$/,
                loader: 'file-loader'
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html"
        })
    ],
    mode: "development"
};
  1. 输入打包命令:
    webpack
  2. 在build目录下生成打包后的built.js文件,并且新生成index.html文件,将built.js文件引入。

devServer

  1. 在webpack.config.js中配置devServer:
const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        filename: "built.js",
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.less$/,
                use: ['style-loader', 'css-loader', 'less-loader']
            },
            {
                test: /\.(jpg|png|gif)$/,
                loader: 'url-loader',
                options: {
                    limit: 8 * 1024,
                    esModule: false,
                    name: '[hash:10].[ext]'
                }
            },
            {
                test: /\.html$/,
                loader: 'html-loader'
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html"
        })
    ],
    mode: "development",

    //开发服务器devServer:用来自动化(自动编译,自动打开浏览器,自动刷新浏览器)
    //特点:只会在内存中编译打包,不会有任何输出
    //启动devServer指令为:npx webpack-dev-server
    devServer: {
        //项目构建后路径
        contentBase: resolve(__dirname, 'build'),
        //启动gzip压缩
        compress: true,
        //端口号
        port: 3000,
        //自动打开浏览器
        open: true
    }
};
  1. 下载相关包:
    npm install webpack-dev-server -D
  2. 启动devServer:
    npx webpack-dev-server
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容