webpack入门

前面的话

  在webpack出现之前,市面上已经存在的模块管理和打包工具并不适合大型的项目,尤其单页面 Web 应用程序。最紧迫的原因是如何在一个大规模的代码库中,维护各种模块资源的分割和存放,维护它们之间的依赖关系,并且无缝的将它们整合到一起生成适合浏览器端请求加载的静态资源。webpack是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载

  webpack的内容丰富且杂乱,对于新手并不友好。本文以一个实例的形式,对webpack的重要概念进行介绍,并着重说明如何使用webpack

概述

  webpack是一个模块打包器。

【特点】

  webpack有以下特点

代码拆分

  webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。

Loader

  Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。

智能解析

  Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require("./templates/" + name + ".jade")。

插件系统

  Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。

快速运行

  Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译

【安装】

  用 npm 安装 Webpack

$ npm install webpack

  一个常见的问题是:安装webpack后,无法使用webpack命令

  这是因为只进行了本地安装,没有全局安装,输入如下代码进行全局安装后即可运行

$ npm install webpack -g

使用

  首先创建一个静态页面index.html和一个JS入口文件entry.js

<!-- index.html -->
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <script src="bundle.js"></script>
</body>
</html>
// entry.js
document.write(‘It works.‘)

  然后编译 entry.js 并打包到 bundle.js:

$ webpack entry.js bundle.js

  打包过程会显示日志:

Hash: f47511e706e3de8f2417
Version: webpack 2.6.1
Time: 47ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.66 kB       0  [emitted]  main
   [0] ./entry.js 27 bytes {0} [built]

  用浏览器打开 index.html 将会看到 It works.

  接下来添加一个模块 module.js 并修改入口 entry.js

// module.js
module.exports = ‘It works from module.js.‘
// entry.js
document.write(‘It works.‘)
document.write(require(‘./module.js‘)) // 添加模块

  重新打包 webpack entry.js bundle.js 后刷新页面看到变化 It works.It works from module.js.

Hash: 09733456f2c5b24a4845
Version: webpack 2.6.1
Time: 61ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.83 kB       0  [emitted]  main
   [0] ./module.js 43 bytes {0} [built]
   [1] ./entry.js 75 bytes {0} [built]

  Webpack会分析入口文件,解析包含依赖关系的各个文件。这些文件(模块)都打包到 bundle.js 。Webpack 会给每个模块分配一个唯一的 id 并通过这个 id 索引和访问模块。在页面启动时,会先执行 entry.js 中的代码,其它模块会在运行 require 的时候再执行

Loader

  Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。

  Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为参数,返回转换的结果。详细信息移步至此   

  接上面的例子,我们要在页面中引入一个CSS文件style.css,要使用require("!style-loader!css-loader!./style.css")代码,代码读取顺序从右向左,表示首页将 style.css 也看成是一个模块,先加载style.css,然后用 css-loader 来读取它,再用 style-loader 把它插入到页面中

/* style.css */
body { background: yellow; }

  修改 entry.js:

require("style-loader!css-loader!./style.css")
document.write(‘It works.‘)
document.write(require(‘./module.js‘))

  安装 loader:

npm install css-loader style-loader

  重新编译打包,刷新页面,就可以看到黄色的页面背景了

  如果每次 require CSS 文件的时候都要写 loader 前缀,是一件很繁琐的事情。我们可以根据模块类型(扩展名)来自动绑定需要的 loader。

  将 entry.js 中的 require("!style-loader!css-loader!./style.css") 修改为 require("./style.css") ,然后执行

$ webpack entry.js bundle.js --module-bind ‘css=style-loader!css-loader‘

  显然,这两种使用 loader 的方式,效果是一样的

配置

  Webpack 在执行的时候,除了在命令行传入参数,还可以通过指定的配置文件来执行。默认情况下,会搜索当前目录的 webpack.config.js 文件,这个文件是一个 node.js 模块,返回一个 json 格式的配置信息对象,或者通过 --config选项来指定配置文件。

  继续我们的案例,在根目录创建 package.json 来添加 webpack 需要的依赖:

{
  "name": "project",
  "version": "1.0.0",
  "devDependencies": {
    "css-loader": "^0.28.4",
    "style-loader": "^0.18.2",
    "webpack": "^2.6.1"
  }
}

  别忘了运行 npm install。然后创建一个配置文件 webpack.config.js,在下面的配置中,对一个单独的module对象定义了rules属性,里面包含两个必须属性:test和use。相当于告诉webpack compiler,碰到「在require()/import语句中被解析为‘.css‘的路径」时,在把它们添加并打包之前,要先使用css-loader后使用style-loader去转换

var webpack = require(‘webpack‘);
module.exports = {
  entry: ‘./entry.js‘, //入口文件
  output: {
    path: __dirname,//出口路径
    filename: ‘bundle.js‘//出口名称
  },
  module: {
    rules: [
      {test: /\.css$/,use: [ ‘style-loader‘, ‘css-loader‘ ]}
    ]
  }
}

  同时简化 entry.js 中的 style.css 加载方式:

require(‘./style.css‘);

  最后运行 webpack,可以看到 webpack 通过配置文件执行的结果和上一节通过命令行 webpack entry.js bundle.js --module-bind ‘css=style!css‘ 执行的结果是一样的

  如果配置文件并不叫做默认的webpack.config.js,而是其他的名称,如test.js,则需要设置如下命令进行打包

webpack --config test.js

插件

  插件可以完成更多 loader 不能完成的功能。插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。Webpack 本身内置了一些常用的插件,还可以通过 npm 安装第三方插件。详细信息移步至此

  想要使用一个插件,只需要require()它,然后把它添加到plugins数组中。内置插件则不需要require,直接使用即可

  接下来,我们利用一个最简单的 BannerPlugin 内置插件来实践插件的配置和运行,这个插件的作用是给输出的文件头部添加注释信息。

  修改 webpack.config.js,添加 plugins

var webpack = require(‘webpack‘);
module.exports = {
  entry: ‘./entry.js‘, //入口文件
  output: {
    path: __dirname,//出口路径
    filename: ‘bundle.js‘//出口名称
  },
  module: {
    rules: [
      {test: /\.css$/,use: [ ‘style-loader‘, ‘css-loader‘ ]}
    ]
  },
  plugins: [
    new webpack.BannerPlugin(‘This file is created by xiaohuochai‘)
  ]
}

  然后运行 webpack,打开 bundle.js,可以看到文件头部出现了我们指定的注释信息:

/*! This file is created by xiaohuochai */
/******/ (function(modules) { // webpackBootstrap
/******/  // The module cache
/******/  var installedModules = {};
// 后面代码省略

开发环境

  当项目逐渐变大,webpack 的编译时间会变长,可以通过参数让编译的输出内容带有进度和颜色

$ webpack --progress --colors

  如果不想每次修改模块后都重新编译,那么可以启动监听模式。开启监听模式后,没有变化的模块会在编译后缓存到内存中,而不会每次都被重新编译,所以监听模式的整体速度是很快的

$ webpack --progress --colors --watch

  比如,执行以上命令后,修改‘style.css‘的body的背景颜色为红色,不用重新编译,刷新页面后,页面即发生改变

  当然,使用 webpack-dev-server 开发服务是一个更好的选择。它将在 localhost:8080 启动一个 express 静态资源 web 服务器,并且会以监听模式自动运行 webpack,在浏览器打开 http://localhost:8080/ 或 http://localhost:8080/webpack-dev-server/ 可以浏览项目中的页面和编译后的资源输出,并且通过一个 socket.io 服务实时监听它们的变化并自动刷新页面

# 安装
$ npm install webpack-dev-server -g

# 运行
$ webpack-dev-server --progress --colors

  比如,执行以上命令后,修改‘style.css‘的body的背景颜色为蓝色,不用重新编译,也不用刷新页面,页面即发生改变

时间: 2024-08-04 02:12:24

webpack入门的相关文章

webpack入门--前端必备

webpack入门--前端必备 什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理.我们可以直接使用 require(XXX) 的形式来引入各模块,即使它们可能需要经过编译(比如JSX和sass),但这不用我们理会,因为 webpack 有着各种健全的加载器(loader)在处理这些事情. 为什么要使用 webpack? 很简单的一个道理,难道写react的同学会不用它

Webpack 入门

Webpack 入门 Webpack 是目前流行的打包工具,如何安装它呢? 1. 安装 Node Js 首先,Webpack 是基于 NodeJs 的工具,你必须首先安装 NodeJs. NodeJs 仅仅只需要在你的系统中安装一次就可以了. 2. 全局安装 Webpack 我们希望能够在系统的任何文件夹中使用 Webpack,使用的方式是通过 Webpack 命令来完成的,这需要我们全局安装 Webpack.这也只需要安装一次,以后每个项目就不需要重新全局安装了. $ npm install

React +ES6 +Webpack入门

React +ES6 +Webpack入门 React已成为前端当下最热门的前端框架之一 , 其虚拟DOM和组件化开发让前端开发更富灵活性,而Webpack凭借它异步加载和可分离打包等优秀的特性,更为React的开发提供了便利.其优秀的特性不再赘述.本文将详细的记录react babel webpack的环境搭建,以及搭建的过程中遇到的一些坑. 一.新建React项目 1.如图为新建react项目结构,其中 entry.js放置react入口代码,index.js放置react组件代码,asse

Webpack 入门指南 - 3. Hello, Angular2!

Webpack 入门指南 - 1.安装 Webpack 入门指南 - 2.模块 这一次,我们使用 Webpack 来打包 Angular 2 的应用. 与官方的 Hello, Angular 2 项目相比,我们不使用 System.js,而是使用 TypeScript 直接编译,然后使用 Webpack 打包生成代码. 1. 下载 Angular 2 以及依赖包 修改我们的 package.json 文件,添加 Angular 2 涉及的包,和 Angular 2 所依赖的包,以后,我们可以慢慢

webpack入门详解

webpack入门详解(基于webpack 3.5.4  2017-8-22) webpack常用命令: webpack --display-error-details    //执行打包 webpack -w               // 提供watch方法:实时进行打包更新 webpack -p           // 对打包后的文件进行压缩 webpack -d            // 提供source map,方便调式代码 webpack -dev-server --open 

webpack入门(四)——webpack loader 和plugin

什么是loader loaders是你用在app源码上的转换元件.他们是用node.js运行的,把源文件作为参数,返回新的资源的函数. 例如,你可以用loaders告诉webpack加载 coffeeScript或者JSX. loaders 特点: 1. 可以链式拼接.他们用在通向文件的管道,最后一个loader预期返回一个javascript,其它Loader可以返回任意格式给下一个loader. 2. loaders可以是同步的,也可以是异步的. 3. loaders是用node.js来跑,

webpack入门文档教程

.octicon{margin-right:2px}a.tabnav-extra:hover{color:#4078c0;text-decoration:none}.tabnav-btn{margin-left:10px}.filter-list{list-style-type:none}.filter-list.small .filter-item{padding:4px 10px;margin:0 0 2px;font-size:12px}.filter-list.pjax-active .

webpack入门——webpack的安装与使用

一.简介 1.什么是webpack webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以直接使用 require(XXX) 的形式来引入各模块,即使它们可能需要经过编译(比如JSX和sass),但我们无须在上面花费太多心思,因为 webpack 有着各种健全的加载器(loader)在默默处理这些事情,这块我们后续会提到. 你可以不打算将其用在你的项目上,但没有理由不去掌握它,

(一)webpack入门——webpack的安装

在看webpack官方文档的主页的时候,看着看着就想放弃 ,英文读起来吃力,也不知道webpack到底是用来干什么的.在之前虽然从别人那里知道webpack是现在很流行的前端构建工具,只是一个概念而已,具体不知道到底是干嘛,怎么用等等.然而在扫了几眼主页的时候还是不知道他用了干嘛的,真的放弃过,后来还是想想硬着头皮看吧.在自己的努力下总算明白了一些,下面将自己从官网学到的记录下来.至于webpack是什么,慢慢跟着我来动手,你就能理解他是什么了. 这篇文章的以下内容来自官方文档(不是直译,也有自

(二)webpack入门——webpack的使用

上一篇文章 (一)webpack入门——webpack的安装 中,我们知道了webpack的安装,接下来我们要学习如何使用webpack. 以下内容来自webpack文档(不是直译): http://webpack.github.io/docs/usage.html 简单的webpack使用   创建一个模块化的Javascript项目 创建一个文件件,在文件夹里面创建两个js文件,分别命名为cats.js.app.js,并使用CommonJs语法来创建文件内容. cats.js文件内容: va