小白学webpack

大家好,我是狗蛋~
平时写项目都是用脚手架,对于webpack真的是一概不知~
前几天在慕课学习《webpack深入与实战》,发现这个真的的从零开始学习,而且是1.X版本的webpack,很适合我这种小白,因为我是最近学习,所以用的是4.6版本的,所以我会用4.6的版本翻转。
我会把作者的描述写进来,该篇就当做是视频的笔记版与我的遇坑记录。


webpack是给js的打包工具,可以把很多的模块打包成很少的一些静态文件,它有自己的一个特性——代码分割(Code Splitting),代码分割可以使项目加载过程中只去当时需要的那部分文件,webpack整个工具里面有一个loader的概念,模块可以通过loader去处理各种各样的文件,无论文件是commonjs还是AMD还是es6,模块化方式写的,都可以通过loader处理,甚至可以处理css文件、图片文件、js文件、coffeescript文件,less文件,甚至自定义文件(.vue,.jsx)


2018.04.20更新。
找到一篇webpack2.X的与视频内容类似的文章
webpack实用配置


接下来在demo01文件夹操作

npm init    // 初始化npm
npm install webpack -D    // 本地安装webpack

新建一个hello.js

function hello(str){
    alert(str);
}

然后打包hello.js

webpack hello.js hello.bundle.js  // hello.js要打包的文件  hello.bundle.js打包后生成的文件

突发情况:这里打包我出了问题,他说我'webpack' 不是内部或外部命令
百度了一下,webpack不是内部命令有两种解决方法

  1. 先全局安装,再在自己工作目录安装使用(不推荐)
  2. 在package.json中添加script,就可以用npm run name执行webpack命令了,name可以任取(推荐)

所以我在package.json的script属性加了一行"start": "webpack",然后命令行输入npm run start,然后爆问题。

在webpack 3中,webpack本身和CLI都在同一个包中,但是在版本4中,他们将两者分开来更好地管理它们。

所以我要say yes,本地装webpack-cli,装好之后又报问题,黄色警告是要在语句中加模式,如图我写的。至于红色的字,算了,加配置文件吧!



webpack.config.js

module.exports = {
    entry: './hello.js',
    output: {
        filename: 'bundle.js'
    }
}

然后运行npm run start,成功了

打包成功之后会给出信息
Hash: 本次打包哈希值
Version: webpack版本
Time: 本次打包所花时间
Asset: 生成的文件
Size: 生成的文件大小
Chunks: 这次打包的分块
Chunk Names: 这次打包的块名称
在生成的dist文件夹中的bundle.js打开,拉到最下面可以看到我们写的hello.js的东西,变样了,哈哈哈


demo02新开一个文件夹,使hello.js引用别的js文件

新建一个world.js

function world(){
    return {}
}

在hello.js引用world.js

require('./world.js');
function hello(str){
    alert(str);
}

然后运行npm run start,成功了


生成dist/bundle.js中自己写的代码

并没有视频中说的[0],[1]模块表示出来....

demo03 webpack怎么处理css文件

不要觉得奇怪,演示而已,你就当做历史过程吧。。。
新建一个style.css

body {
    background: lightskyblue;
}

在hello.js引用style.css

require('./world.js');
require('./style.css');
function hello(str){
    alert(str);
}

然后运行npm run start,按照视频所说的,会报错,好的,如愿报错~


你需要一个适当的loader处理css文件,好的,在目录下(本地)安装这个loader

npm install css-loader style-loader -D

并且给相应的文件指定的loader require('css-loader!./style.css'); 全部代码如下:

// hello.js
require('./world.js');
require('css-loader!./style.css');
function hello(str){
    alert(str);
}

然后运行npm run start,成功~

生成dist/bundle.js中自己写的代码

demo04创建一个index.html更直观的看到css的效果

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack test</title>
</head>
<body>
    <script src="./dist/bundle.js"></script>    // 这里因为我们是另外新建的html来引入生成后的js,所以是双击打开html文件查看效果
</body>
</html>

hello.js

require('./world.js');
require('css-loader!./style.css');
function hello(str){
    alert(str);
}
hello('hello world!');

然后npm run start,成功~双击打开html文件查看效果

alert效果出来了,但是css没有效果

少了style-loader处理文件了,css-loader是处理css文件,style-loader是处理css-loader处理完的文件,新建style标签插入html文件。所以,要改一下

// hello.js
require('./world.js');
require('style-loader!css-loader!./style.css');
function hello(str){
    alert(str);
}
hello('hello world!');

然后npm run start,成功~


除了在文件中引用css时,加入loader,也可以在命令行加入loader,但是真正开发不会这样做的,我这里就不演示了....


明晚或后晚再演示一整个小项目那种~
2018.04.21 更~


demo05 建立项目

在demo05文件夹中创建文件夹,然后初始化npm,本地安装webpack、webpack-cli,项目标配~

npm init
npm install webpack webpack-cli -D

新建文件夹src(放代码)、dist(放打包后生成文件)以及初始化页面index.html
再在src文件夹中创建script(放脚本)与style(放样式)文件夹
创建webpack.config.js

我们之所以在项目下建立一个webpack配置文件是因为我们直接使用webpack命令,webpack会在根目录下直接找到webpack.config.js,把它当做默认配置去运行

编辑webpack.config.js

module.exports = {  // commonjs的模块化输出
    entry: './src/script/main.js',      // 打包入口从哪开始  相对路径
    output: {   // 打包以后的文件放什么地方
        path: __dirname + '/dist/js',    // 之前定义好的dist文件下的js文件夹  绝对路径
        filename: 'bundle.js',   // 打包以后的文件名叫什么
    }
}

在script文件夹下新建main.js
编辑main.js

function helloworld(){}

在命令行输入webpack

我这里出了点问题

那我在package.json里的script属性写命令了
编辑package.json,该文件不能有注释

{
  "name": "demo05",
  "version": "1.0.0",
  "scripts": {
    "dev": "webpack --mode development",   // 没有写模式webpack4.6会出警告
    "build": "webpack --mode production"   // 没有写模式webpack4.6会出警告
  },
  "license": "ISC",
  "devDependencies": {
    "webpack": "^4.6.0",
    "webpack-cli": "^2.0.15"
  }
}

执行成功
在dist/js文件夹下可以看到bundle.js,还压缩了

如果把webpack.config.js命名为webpack.dev.config.js,执行的webpack命令是webpack --config webpack.dev.confit.js,因为默认的是webpack.config.js,否则会报错。


视频里讲到webpack的命令参数,--progress显示进度,--display-modules显示打包模块,--colors显示信息有颜色,--display-reason打包原因,4.6版本除了没有显示进度,其他都没什么效果。所以就不演示了。

在nodejs中也可以使用webpack,直接把webpack配置作为一个对象传给webpack。日常中很可能用nodejs写工具,在工具里面调用webpack,就会用到这种方式。这块内容后面会谈到。

webpack.config.js配置讲解
  1. entry
    webpack打包入口指示,有三种输入方式来匹配不同需求
    • (1) string,指定一个入口文件,所有的依赖都在这个入口文件指定
    • (2) 数组,为了解决多个互不依赖的文件打包在一起,例如entry: ['./src/script/main.js','./src/script/a.js']
    • (3) 对象,key表示chunk name,value表示真的的一个入口,value既可以是string,也可以是数组。使用场景是在多页面应用,根据page1、page2给不同页面不同的chunk,page1入口是main.js,page2入口是a.js。例如:
      entry: {
               "page1": './src/script/main.js',
               "page2": ['./src/script/a.js'],      // 打包入口从哪开始  相对路径
      }
      
  2. output
    官网中指明不要在filename中使用绝对路径,因为path会真正指定路径。如果entry是单文件,那么filename就是可以写死,如bundle.js。如果entry是多入口,filename还是写死一个文件,那会造成覆盖,只生成一个文件。所以需要占位符保证输出是唯一的,如[name]表示chunkname,entry表示作为对象时的key、[hash]是这次打包的hash、[chunkhash]是每一个chunk的hashdemo06作为该例子。
    // webpack.config.js
    module.exports = {  // commonjs的模块化输出
        entry: {
            "main": './src/script/main.js',
            "a": ['./src/script/a.js'],      // 打包入口从哪开始  相对路径
        },
        output: {   // 打包以后的文件放什么地方
            path: __dirname + '/dist/js',    // 之前定义好的dist文件下的js文件夹  绝对路径
            filename: '[name].[hash:6].js',   // 打包以后的文件名叫什么
        }
    }
    

demo07 自动化生成项目中的html页面

我们打包之后的js要在html里引用,但是我们不可能每次打包就手动改一次,为解决这个问题,我们可以使用html-webpack-plugin插件。
本地安装插件npm install html-webpack-plugin -D
这个插件的介绍,也有中文的详细介绍

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

推荐阅读更多精彩内容