webpack学习

webpack.png

webpack是静态模块打包器,它有一个模块的概念,webpack将所有文件都看作是模块,将这些模块分类并配置一定的规则,按照这些规则进行处理的过程,就是webpack的工作过程。
webpack具体是如何工作的,在项目中该如何去使用,是这篇文章要跟大家分享的,我会将学到的内容及时分享在这里~
这篇文章,基于webpack 4.x版本,与webpack 3有一些不同之处,学习webpack3的也可以作为参考~

安装

1.在安装之前,我们需要在项目根目录已经创建好package.json文件,如果没有,执行以下指令去创建:
npm init
2.使用npm安装webpack,终端进入到项目根目录,执行以下指令进行安装:
npm install webpack --save-dev
3.创建目录,项目结构如下:

mulu.png

app:我们所有的源文件都写在app文件夹下

main.js为webpack的入口文件(下面会讲到)
public为webpack打包后输出的文件夹
webpack.config.js为webpack配置文件(放在根目录下)

配置文件

为了更容易去理解,先简单介绍一些webpack的配置文件webpack.config.js

// 基本配置
var path = require('path');

module.exports = {
  mode: 'development',
  entry: './app/main.js',
  output: {
    path: path.resolve(__dirname, 'public'),
    filename: 'bundle.js'
  }
};
// 解释:这段代码告诉webpack,使用development模式的内置优化,以app文件夹下的main.js作为入口,以bundle.js作为输出,输出路径为根目录下的public文件夹。

mode:告知 webpack 使用相应模式的内置优化。

官方解释是这样的:


mode.png

webpack 4之前是没有mode配置的。

entry:指定入口文件,也可以是个数组,放入多个入口文件
outpub:输出,可以控制webpack如何向硬盘写入编译文件

接下来,我们要做的事情:

  1. 使用webpack来将项目中的.less文件转换为.css文件,并将生成的.css文件输出
  2. 以app文件夹下的index.html为模板文件,输出新的.html文件,并引入.css文件

入口entry

目录中的main.js是webpack的入口文件,什么是入口文件?
入口文件,是为了让webpack知道我们项目使用了哪些模块,以及这些模块之间的依赖关系,即作为webpack内部依赖图的开始。

要将.less文件转换为.css文件,首先先创建.less文件:
在/app/project_one路径下创建 common.lessindex.less 文件。
common.less 文件写入共用样式;
index.less 文件写入index.html页面用到的样式,该文件使用 @import 引入 common.less

common.less

html {
    box-sizing: border-box;
    -ms-text-size-adjust: 100%;
    -webkit-text-size-adjust: 100%;
}
*, *:before, *:after {
    box-sizing: inherit;
}
body {
    margin: 0;
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    background: red;
}
h1, h2, h3, h4, h5, h6, p, ul {
    margin: 0;
    padding: 0;
}
.flex{
    display: flex;
}

index.less

// index.less
@import 'common.less';
.main{
    width: calc(100% - 100px);
}

创建好我们的样式文件,接下来,需要在入口文件 mian.js 中引入样式文件,告诉webpack要处理的样式文件

main.js

import './project_one/index.less';

对比 Node.js 模块,webpack 模块能够以各种方式表达它们的依赖关系,几个例子如下:

  • ES2015 import 语句
  • CommonJS require() 语句
  • AMD define 和 require 语句
  • css/sass/less 文件中的 @import 语句。
  • 样式(url(...))或 HTML 文件(<img src=...>)中的图片链接(image url)

输出output

在webpack中,配置output最低要求是,将它的值设置为一个对象,包括两个属性:
filename:输出的文件名称
path:输出的文件路径

在这里,我们这样配置:

output: {
    path: path.resolve(__dirname, 'public'),
    filename: 'bundle.js'
}
补充:

如果,我们的入口文件有多个,配置文件中 entry 需要配置为数组;如果想让不同的入口文件,对应不同的输出文件,怎么办呢?可以使用占位符,需要了解的可以访问占位符

module.exports = {
    entry: {
          main: './app/main.js',
          index: './app/index.js'
    },
    output: {
        path: path.resolve(__dirname, 'public'),
        filename: '[name].bundle.js'
    }
}
占位符
  • name:entry 定义的 key 值,即上面代码中的 main 和 index
  • hash:每次构建 webpack,都会生成唯一的 hash 值
  • chunkhash:打包的模块会生成唯一 hash,模块有变动,重新打包的模块 hash 会生成新的;而没有更改的模块打包生成的 hash 不变

模块module

配置文件中的 模块 用于处理项目中不同类型的模块。

module.rules - module中的主要属性rules

创建模块时,匹配请求的规则数组
每个规则又有很多属性,这里我们主要用到了 testuse

  • test:条件,即通过条件去匹配需要处理的文件
  • use:在规则条件匹配时使用,每个use指定使用一个loader,loader 用于对模块的源代码进行转换, 下面会讲到
module: {
        rules: [
            {
                test: /\.less$/, // 正则匹配 .less 结尾的文件
                use: [
                     { loader: 'style-loader' } // 直接创建<style>加入到页面
                     // 'style-loader' 这里是简写,省略了loader
                ]
            }
        ]
    }

预处理器loader

需要的 loader 有:

  • style-loader:会在html文件中插入<style></style>,并将打包好的css放入style中
  • css-loader:加载 css 文件
  • less-loader:将 .less 文件转换为 .css 文件

使用这些loader,首先要安装这些loader,nodejs中使用 npm 安装:

npm install style-loader css-loader less-loader less --save-dev

来看代码:

rules: [
    {
        test: /\.less$/,
        use: [
            // 这里都是简写
            'style-loader',
            'css-loader',
            'less-loader'
        ]
    }
]

注意:值得注意的是,loader 是有加载顺序的,loader 的加载顺序是从后向前加载的,即:先加载less-loader 将 .less 文件转换为.css文件,其次加载 css-loader 处理.css文件,最后加载style-loader ,将css写入html。

插件plugins

插件,是用来扩展webpack功能的,它们会在整个构建过程中生效,执行相关的任务。
很多时候,Loaders 和 Plugins 很容易被搞混,其实它们是完全不同的东西,loaders 是在打包构建工程中用来处理源文件的,一次处理一个;插件不会直接操作单个文件,而直接对整个构建过程起作用。

这里,我们介绍 html-webpack-plugin 插件,它的作用有哪些呢?

  1. 为 html 文件引入外部资源
  2. 可以生成html入口文件,即.html文件;配置N个html-webpack-plugin可以生成N个页面

首先,通过npm安装html-webpack-plugin插件:
npm install html-webpack-plugin --save-dev

使用:

  1. webpack 配置文件顶部require引入
  2. plugins 中创建
const htmlWebpackPlugin = require('html-webpack-plugin');

// plugins 与 entry、output同级
plugins: [        
        new htmlWebpackPlugin({
            filename: 'index.html',
            template: './app/index.html',
            inject: 'body'
        })
]

解释一下:

  • filename:生成的文件名称
  • template:本地模板文件位置,生成的.html文件以指定的文件为模板
  • inject: 引入的外部资源,插入到html中的位置

先附上完成配置文件代码:

const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: path.resolve(__dirname, 'app/main.js'),
    output: {
        path: path.resolve(__dirname, 'public'),
        filename: 'bundle.js'
    },
    module: {
        rules: [
            {
                test: /\.less$/,
                use: [
                    'style-loader', // 直接创建<style>加入到页面
                    'css-loader',
                    'less-loader'
                ]
            }
        ]
    },
    plugins: [
        new htmlWebpackPlugin({
            filename: 'index.html',
            template: './app/index.html',
            inject: 'body'
        })
    ],
    mode: 'development'
}

到这里,我们最初布置的任务就算完成了,接下来只剩下打包了~

打包

打包很简单,只需要在package.json中的scripts下添加如下代码:
"start": "webpack --config webpack.config.js --progress --display-modules --colors --display-resasons"
接着在终端,cd到项目根目录,运行npm start就开始运行webpack打包了~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容