Webpack学习(二)

本篇主要内容为:

  • 安装webpack和依赖的js工具库Lodash
  • 通过默认配置和指定配置文件,分别打包文件
  • 使用NPM脚本运行webpack

使用webpack的前提是必须安装node.js,链接:Node.js,安装方法可百度,另外下述所有npm安装方法都可以改成使用淘宝镜像的cnpm。

安装:

  • 本地安装
  • 全局安装

不建议全局安装,因为会将webpack锁定到指定的版本,另外也会在不同的webpack版本的项目中构建失败。

npm install --save-dev webpack  //安装最新版本的webpack

因为使用的是webpack v4以上的版本,所以再安装cli工具:

npm install --save-dev webpack-cli

使用本地安装的好处是当升级项目时会比较方便,如果正确执行了上述的两个命令,会在本地目录(已有项目的根目录,我用的开发工具是vscode)多出一个node_modules目录和一个package.json文件。

//package.json文件
{
  "devDependencies":{
    "webpack": "^4.27.1",
    "webpack-cli":^3.1.2"
  }
}

这是刚才安装的依赖,此时的package.json只有三行代码,表明了webpack和webpack-cli的版本.

假如我们需要安装用来读取css文件的css-loader,再用style-loader把它插入到页面中。可以在命令行中输入:

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

可以看到,在package.json中,devDependencies这个字段有个改变

"devDependencies": {
    "css-loader": "^0.23.1",
    "style-loader": "^0.13.0",
   ...
}

另外,我们也可以用另一种方式来安装:直接在package.json中,添加相应的依赖(如上面的代码),之后的命令行中运行npm install,它会自动帮我们安装相应的依赖。

打开命令行,进入到项目目录,或在vscode中用ctrl+shift+`键打开命令行,执行以下命令:

npm init

我们在安装webpack时会生成了一个package.json,而这个命令会初始化一个新的package.json,其内容会直接追加到文件中。执行npm init命令后,会向你提问一系列问题,除了名字之外,其余可以直接回车热水壶,新生成的package.json类似如下 :

"devDependencies": {
    "webpack": "^4.27.1",
    "webpack-cli": "^3.1.2"
  },
  "name": "webpackstudy",
  "description": "webpack入门学习手记",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "ajv-errors": "^1.0.1",
    ...
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://gitee.com/yilianzz/projects?scope=forked"
  },
  "author": "yilianzz",
  "license": "MIT"

此时,找到官网的指南手册中的scripts,在默认的test后面添加上官网中的代码,如下 :

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack --config webpack.config.js"
  }

script.start,它指的是运行webpack,并且运行的配置文件是webpack.config.js。

npm run start就会去执行配置文件中的打包代码

参考链接:https://segmentfault.com/a/1190000017384378
删掉package.json文件,按照手册给出的示例,在一个全新的目录下进行操作

npm init -y //不再询问参数,直接使用默认值 
npm install webpack webpack-cli --save-dev

接下来,在项目目录下创建相应的html和js文件

webpackStudy
  |- package.json
+ |- index.html
+ |- /src  //新建一个src目录
+   |- index.js

src/index.js

function component() {
  let element = document.createElement('div');
  // Lodash, currently included via a script, is required for this line to work
  // 这段英文注释的意思是说,在index.html文件中已经引入了Lodash这个script标签了,所以能正常使用
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  return element;
}
document.body.appendChild(component());

index.html

<!doctype html>
<html>
  <head>
    <title>Getting Started</title>
    <script src="https://unpkg.com/lodash@4.16.6"></script>
  </head>
  <body>
    <script src="./src/index.js"></script>
  </body>
</html>

在html页面中,引入了Lodash这个js文件,它是一个JS实用工具库,非常适合于遍历数组、字符串和对象等

然后修改package.json文件,删掉main入口,并设置private,防止意外发布代码

package.json

{
 "description": "",
+   "private": true,
-   "main": "index.js"
}

上述中,在index.js中,并没有显示地声明需要引入Lodash,这样就会造成以下几个问题:

  • 没有显示声明,index.js中的代码依赖于外部的扩展库
  • 如果依赖不存在,或者引入错误,应用程序无法正常执行。例如没有引用 Lodash
  • 如果依赖文件被引入了,但是没有使用,浏览器就会下载无用代码。

如果使用webpack来管理JS,情况就会不一样


创建一个打包文件

首先调整一下工作目录,创建一个dist目录,它用来存放压缩和优化之后的代码。而我们之前创建的src目录,则用来存放原始代码。将之前创建的index.html文件移动到dist目录下。最张文件结构如下:

project
webpackStudy
  |- package.json
+ |- /dist
+   |- index.html
- |- index.html
  |- /src
    |- index.js

这次,我们要在index.js中显示地声明Lodash,所以先在项目目录下安装Lodash,执行命令:

npm install --save-dev lodash

--save-dev参数,会将Lodash添加到package.json的devDependencies属性下

接下来,显示地引用Lodash

src/index.js
+ import _ from 'lodash';
+
  function component() {
    let element = document.createElement('div');

-   // Lodash, currently included via a script, is required for this line to work
    element.innerHTML = _.join(['Hello', 'webpack'], ' ');

    return element;
  }

  document.body.appendChild(component())

然后更新index.html,因为我们修改了依赖js的方式

dist/index.html
<!doctype html>
  <html>
   <head>
     <title>Getting Started</title>
-    <script src="https://unpkg.com/lodash@4.16.6"></script>
   </head>
   <body>
-    <script src="./src/index.js"></script>
+    <script src="main.js"></script>
   </body>
  </html>

最后,执行下面的命令

npx webpack

然后打开index.html文件,就会看到hello webpack。由于我们在执行npx webpack时,没有使用执行的配置文件,所以使用默认值,也就是在dist目录下生成main.js。而这个打包之后的文件,就在index.html引入。如果打开main.js,会发现Lodash已经在这个文件中了,webpack会自动帮我们添加好。


指定配置文件

在webpack4中,不用指定配置文件,但是这样会导致可扩展性变差,因此我们需要在工作目录下创建一个webpack.config.js文件。内容如下

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',  //就是上面生成的main.js
    path: path.resolve(__dirname, 'dist')
  }
};

然后执行命令:

npx webpack --config webpack.config.js

如果添加了webpack.config.js文件,则webpack会自动使用这个配置文件,所以也可以不指定这个参数。但是假如文件的名称不是webpack.config.js时,就必须用到--config这个参数了。


NPM脚本

前面部分中,在package.json中添加了scripts.start,现在同样地在package.json中添加一段脚本,这样我们在每次运行程序时只需要简单调用脚本即可

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.config.js"
  }

然后只需要在命令行中执行如下命令:

npm run build

它制定了package.json中的script脚本,其中build就是我们刚才定义内容。

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

推荐阅读更多精彩内容