带你入门Webpack及它能干什么?

前言

初衷: 本文我们讲一下Webpack,说说它能干什么及为什么要使用它。把我整理的笔记分享给大家,如有错误请各位指出,不喜勿喷。

适合人群: 前端初级开发,大佬绕道。

本文讲解是Webpack4.x,注意版本。

为什么要使用Webpack

在之前我们都是用传统的方式去开发一个系统,htmlcssjs,就这些。开发完之后直接给后台人员去部署,当然这没什么问题。当我们的项目需求不断增加,代码也就越多,越不好维护,一个文件代码都上百甚至上千行,里面代码甚至都是重复的,还需要担心script标签依赖顺序问题,还需要担心代码变量污染问题,这时就出来了模块化,防止变量污染及依赖顺序问题,而现在主流打包工具就是Webpack,强大的社区支撑且支持Es ModuleCommonJsAMD规范。

什么是Webpack

Webpack是一个模块打包工具,可以将Es ModuleCommonJs的语法处理成浏览器可以运行的代码,把文件相关联的依赖打包成一个js文件。

Webpack能干什么

利于我们便捷开发,帮助我们在本地搭建一个服务,代码变动热更新及不刷新页面,全局注入依赖文件,代码分割,代码提取,去除不必要的代码,区分环境变量,图片优化等,社区强大的插件扩展,帮助我们项目便捷开发。

安装

安装Webpack环境也非常的简单,一般情况下建议本地安装,全局安装可能会跟别的项目起冲突,尽量本地安装。

cnpm i webpack@4 webpack-cli --save

上面安装的webpack是语法,webpack-cli是命令行操作的执行命令

安装完之后,不能直接webpack -v这样会报错, 因为它会去全局找你的webpack环境,但你现在是本地安装,使用npx webpack -v这样会在你项目进行本地查找。

快速上手

初始化package.json文件

在你的项目文件下执行该命令,进行对应填写(一路回车也可以),傻瓜式操作。

npm init

项目结构

|- /node_modules
|- /src
   |- index.js
   |- news.js
   |- index.css
|- index.html
|- webpack.config.js
|- package.json

Entry

entry打包入口文件,打包入口有好几种形式,下面我们来一一介绍它们。

单入口

module.exports = {
    entry: "./src/index.js"
}

多入口

多入口打包,js文件名称则是对象的key值。

module.exports = {
    entry: {
        index: "./src/index.js",
        news: "./src/news.js"
    }
}

数组入口

数组打包,entry接收一个数组对象,里面参数只有最后一个值才是真正的打包路径,其它参数都是将本路径文件导入到最后一个参数里面

module.exports = {
    entry: ["./src/news.js", "./src/index.js"]
}

// 上面entry那种操作,等同于如下:
// index.js
require("news.js")

上面example中,除了最后一个参数,将其它数组参数都导入到最后一个参数文件内

Output

output有入口文件就得有出口文件,

module.exports = {
    output: {
        path: __dirname + "/dist",
        filname: "app.js"
    }
}

filename有几个名称选项,我来看介绍一下

  • [name] 使用入口文件名称
  • [chunkhash] 生成hash值,是通过当前文件所依赖的进行解析,最后生一个chunk,在生成hash值
  • [contenthash] 当文件内容改变值,hash值才会改变
  • [id] 使用chunk id生成文件名
  • [hash] 使用hash作为文件名称,每次生成的hash都不一样
module.exports = {
    output: {
        path: __dirname + "/dist",
        filname: "[name][id][contenthash].js"
    }
}

Loader

loader是什么,以上我们只说了js相关的,Webpack默认只认识js文件,那么Webpack怎么打包js之外的东西呢,打包js之外的就会报错,这怎么办呢,这时候使用loaderloader是一个转换器,我们下面以css文件为例子讲解

  • test 接收一个正则表达式,匹配文件后缀名称,匹配成功进入该loader执行
  • use 接收一个数组,当只有一个loader可以写成一个字符串

css-loader

安装

npm i css-loader --save-dev

使用

module.exports = {
     module: {
        rules: [
            {
                test: /\.css$/,
                use: ["css-loader"] or "css-loader"
            }
        ]
    }
}

配置完该loader不会报错了,但是代码还是不生效。只是解析了css文件,并没有将style挂载到页面上,需要结合style-loader

style-loader

安装

npm i style-loader --save-dev

使用

module.exports = {
     module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    "style-loader",
                    "css-loader"
                ]
            }
        ]
    }
}

上面example中,loader必须有顺序执行,loader是从后往前执行的,先解析css文件,然后将解析完的css文件挂载到页面style标签上,这时在看代码就会生效。

Plugins

clean-webpack-plugin

这时如果我们把output里面的filename修改之后,再次打包,可以看到之前的dist包里面的旧代码还依然存在,这时我们想每次打包都生成一个新的dist目录,这时就需要用到插件了。

安装clean-webpack-plugin插件, 我本地安装是3.0.0的版本

npm i clean-wenpack-plugin --save-dev

使用

const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
    plugins: [
        new CleanWebpackPlugin()
    ]
}

html-webpack-plugin

我们打包完dist目录下没有,index.html文件,那么我们可以使用该插件,在每次打包时都会生成一个html文件,下面我们来安装一下

安装html-webpack-plugin我这里使用的是3.2.0版本,需要注意的是,你本地的node版本越高,安装的插件越新,可能新版本会跟webpack4有点不兼容甚至导致代码报错。

npm i html-webpack-plugin@3.2.0 --save-dev

使用

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

module.exports = {
    plugins: [
        new HtmlWebpackPlugin({
            template: './index.html',  // 以咱们本地的index.html文件为基础模板
            filename: "index.html",  // 输出到dist目录下的文件名称
        }),
    ]
}

html-webpack-plugin插件接收一个对象,这个对象有一些属性值,这里咱就不一一举例了,可以看这篇文章《html-webpack-plugin用法全解》

完整代码

const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    entry: "./src/index.js",
    output: {
        path: __dirname + "/dist",
        filename: "index.js"
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    "style-loader",
                    "css-loader"
                ]
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template: './index.html',
            filename: "index.html",
        }),
    ]
}

总结

到这里我们的webpack入门就讲完了,实现了一个简单的打包,webpack默认只认识js文件,要想使用css及图片,可以使用loader进行转换。可以看到最后打包完,dist目录下还是一些原来的文件htmlcssjs,直接把dist包给后台部署就行。

更多常用的loader之常用plugin下期分享,记得关注我哟❤❤❤。

感谢

谢谢你读完本篇文章,希望对你能有所帮助,如有问题欢迎各位指正。

我是蛙人(✿◡‿◡),如果觉得写得可以的话,请点个赞吧❤。

感兴趣的小伙伴可以加入 [ 前端娱乐圈交流群 ] 欢迎大家一起来交流讨论

写作不易,「点赞」+「在看」+「转发」 谢谢支持❤

往期好文

《聊聊在Vue项目中使用Decorator装饰器》

《聊聊什么是CommonJs和Es Module及它们的区别》

《带你轻松理解数据结构之Map》

《这些工作中用到的JavaScript小技巧你都知道吗?》

《【建议收藏】分享一些工作中常用的Git命令及特殊问题场景怎么解决》

《你真的了解ES6中的函数特性么?》

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

推荐阅读更多精彩内容