【Webpack的使用指南 01】Webpack入门

使用Webpack有一段时间了,但是感觉之前学的用的都比较零散,所以在这里整理一下Webpack的使用知识,从入门到进阶。

创建项目

首先创建最简单的一个项目

npm init

得到以下项目结构:


项目结构

安装Webpack

先来个全局的

npm i webpack -g

再安装项目中的

npm i webpack --save-dev

此时项目结构为,且注意到package.json中自动生成了对webpack的开发依赖:


项目结构

Webpack的打包初体验

现在让我们用Webpack来打包文件,那么新建一个js文件如下:


简单打包

然后执行命令

webpack ./src/app.js ./build/bundle.js

那么就会在根目录下生成一个build文件夹,里面会有一个bundle文件


打包后的结构

可以查看bundle.js的js文件信息,里面的作用就是用了一个立即执行函数,然后将app.js的内容封装成一个函数,作为参数传进内部执行。这样就可以来分析处理依赖什么的了。
原理就是这个样子,具体的可以自己看一下底层代码就行,对于这种只打包一个文件的bundle.js,代码也很好看懂。

每次打包都这样输入一大串命令明显很烦,所以需要用到package.json的脚本功能,很简单,修改它为:

{
  "name": "webpack-demo",
  "version": "1.0.0",
  "description": "webpack的使用demo",
  "main": "index.js",
  "author": "韩子卢",
  "license": "MIT",
  "devDependencies": {
    "webpack": "^3.10.0"
  },
  "scripts": {
    "build": "webpack ./src/app.js ./build/bundle.js"
  }
}

对比之前的文件内容,明白玩法就好了,然后我们如果再想打包,那么运行命令:

npm run build

也行,当然命令不一定要用build,把在package.json 里把build改为dota都行,此时运行的命令自然是:

npm run dota

这样做的好处是,简单方便,一些命令就不用记下来了,其次其他人很容易知道这个项目中如何进行打包。

Webpack命令的一些常用参数

参数 作用
-p 对打包的文件进行压缩
-d 提供source map,方便调式代码
--watch 监控源文件,如果源文件做了修改,那么立马生成新的打包文件

webpack的配置文件

一般使用webpack都不会直接用webpack命令来生成某个脚本,因为它还有些强大的功能不好在简单命令里面实现,这个时候就需要用到webpack的配置文件了。

此时在根目录下新增一个文件:

webpack的配置文件

然后命令行运行:

webpack

此时webpack会自动检索根目录下的webpack.config.js文件,然后根据这个文件中的配置去打包文件。
接下来我们分析一下webpack.config.js的代码:

module.exports = {
  entry: './src/app.js',
  output: {
    filename: './build/bundle.js'
  }
};

module.exports为导出对象,webpack会直接读取这个导出对象来打包代码,所以我们将打包的配置直接赋值给这个对象。
entry代表入口,即打包的时候从哪个文件开始打包,
output代表输出配置,即打包后生成的文件配置,其中的filename代表文件名。
上面的打包配置可以简单理解为,从'./src/app.js'文件开始打包,生成一个文件名为bundle.js的文件,它的路径是'./build/bundle.js'。

这里我们也可以这么写:

module.exports = {
  entry: './src/app.js',
  output: {
      path: __dirname + '/build',
      filename: 'bundle.js'
  }
};

注意,这里的path代表文件的输出目录,当我们用了path之后,filename就直接写文件名,而不要再写路径了,因为新的路径是path来的,如果还按照原来的,会在build文件夹下再生成一个build文件夹。
此时看到配置中还出现了一个__dirname变量,这个变量我们也没赋值,放的是什么呢?
__dirname实际上是webpack在编译时自己内部加上的一个变量,它代表webpack.config.js这个文件在电脑中的绝对路径。
想到这么玩的好处了吗,比如利用在filename中加相对路径可以直接生成文件到电脑中的发布网站下面。

webpack的插件

webpack的功能强大有一部分的原因就是插件的功能多且强。

然而我们在使用插件前需要明白一点,我们使用的目的是为了解决问题,而不是为了使用而使用。
现在我们项目的问题是什么?
首先没有html,这个简单,直接新建一个html即可,不需要插件。

加入html后的结构

但是如果这样玩的话,每次生成的js文件名都是bundle.js,那么网站就会形成缓存,导致明明发布了也没有效果啊。
解决这个问题的办法是在js后面加版本号,比如bundle.v1_1_0.js,我们可以手工操作进行修改,但是总有忘记的时候,这样就会出错。
那么问题就这么产生了,解决这个问题的插件就是:html-webpack-plugin
接下来让我们来开始使用这个插件。
首先webpack内部没有集成这个插件,需要我们去安装:

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

然后删掉index.html,并修改webpack.config.js为:

var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/app.js',
  output: {
    path: __dirname + '/build',
    filename: 'bundle.js'
  },
  plugins: [new HtmlWebpackPlugin()]
};

此时运行

webpack

可以发现在我们的输出目录build下还生成了一个index.html,里面还自动引入了我们生成的的bundle.js。


生成html文件

可是这样并没有解决我们的问题,那么让我们来使用html-webpack-plugin的更多功能,修改webpack.config.js文件为:

var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/app.js',
  output: {
    path: __dirname + '/build',
    filename: 'bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: "Webpack Demo",
      filename: 'demo.html',
      minify: {
        collapseWhitespace: true,
      },
      hash: true
    })
  ]
};

生成后发现在输出目录生成的html文件名变味了demo.html,html的标题成了Webpack Demo,引用的js有了hash值,并且html还被压缩了,去掉了里面所有可折叠的空白元素。

这样就行了吗?
不够的,实际的开发过程中我们遇到html结构没有这么简单,会需要更多的html结构。
就比如我想在生成的html中引入一个bootstrap的css。
这又是一个新的问题,然而html-webpack-plugin的模板功能可以解决这个问题。
新建一个模板html文件template.html,


模板文件.png

修改webpack.config.js为:


image.png

这样就会以index.html文件为模板生成最后的html文件,当然html-webpack-plugin还有更多的功能,这里就不细说了。

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

推荐阅读更多精彩内容