前端学习笔记

Webpack笔记

2017-02-23  本文已影响237人  不二很纯洁

webpack 笔记

Webpack 是一个模块加载器,它同时支持AMD、CMD加载规范。与其他模块化加载器相比,他具有以下优势:

  1. 代码分割

    Webpack支持两种依赖加载:同步和异步。
    同步的依赖会在编译时直接打包输出到目的文件中;异步的依赖会单独生成一个代码块,只有在浏览器运行需要的时候才会异步加载该代码块。

  2. Loaders

    在默认的情况下,Webpack 只能处理JS文件,但是通过加载器我们可以将其他类型的资源转换为JS输出。

  3. 插件机制

    Webpack 提供了强打的插件系统,当 Webpack 内置的功能不能满足我们的构建需求时,我们可以通过使用插件来提高工作效率。

安装

全局安装:

$ npm install webpack -g

初始化npm项目:

$ npm init

项目中安装:

$ npm install webpack -save-dev

基本使用

先看一个最简单的基于webpack命令行参数打包的例子

目录结构:

example
  |- app.js
  |- demo.js

基于CommonJS规范引用依赖文件,文件内容:

// demo.js
var names = ['aaa','bbb','ccc'];
module.exports = names;


// app.js
names = require('./demo.js');
console.log(cats);

app.js是JavaScript入口文件,webpack将会从该文件开始对依赖文件进行打包

执行命令:

  1. 初始化npm项目

     $ npm init
    
  2. 项目中安装webpack

     $ npm install webpack -save-dev
    
  3. 执行打包命令

     $ webpack ./app.js app.bundle.js
    
    • app.js 打包的入口文件
    • app.bundle.js 最终输出文件

以上命令运行后,webpack会解析依赖的文件,然后打包输出到app.bundle.js文件

在node中运行打包后的app.bundle.js

$ node app.bundle.js

['aaa','bbb','ccc']

webpack命令行

简单打包:

$ webpack <entry> <output>

自定义打包过程(常用参数)

配置文件

对于复杂的打包,我们可以在项目的根目录下提供一个配置文件,在配置文件中对打包过程进行更详细的配置。

在项目根目录不提供参数直接调用webpack命令:

$ webpack

webpack默认会调用项目根目录下的 webpack.config.js 文件。

我们也可以通过 -config 参数指定配置文件:

$ webpack -config webpack.config.build.js

配置文件的内容需要通过 module.exports 进行导出:

// webpack.config.js
module.exports = {
    // 配置选项
}
看看webpack中包含的配置选项:
看看常用选项的含义和用法:

开发调试

开发代码时,可以使用 webpack-dev-server 在浏览器中进行调试。

webpack-dev-server 是一个基于 Express 的 Node.js 服务器。在文件发生改变时,它会自动触发打包过程,然后通过 Socket.IO 通知浏览器刷新页面,可以大大提高工作效率。

使用插件

在 Webpack 提供的基本功能不能满足需求的情况下,Webpack 还允许我们使用插件来控制打包的各个过程。

常用插件

介绍几款 Webpack 内置的常用插件的使用。

  1. DefinePlugin

    DefinePlugin 插件用来替换指定变量,代码示例如下:

     // webpack.config.js
     // 首先需要引入 Webpack
     var Webpack = require('webpack');
     module.exports = {
         ...
         ...
         plugins: [
             // 注册Webpack内置插件
             new webpack.DefinePlugin({
                 VERSION: JSON.stringify("5fa3b9"),
                 BROWSER_SUPPORTS_HTML5: true,
                 TWO: "1+1"
             })
         ],
         ...
     }
    
     // 待编译的文件
     console.log("Running App versin " + VERSION)
     // 编译后:console.log("Running App versin 5fa3b9")
    
     if(!BROWSER_SUPPORTS_HTML5) require("html5shiv")
     // 编译后:if(!true) require("html5shiv")
    
     var two = TWO
     // 编译后:var two = 1+1
    
  2. ProvidePlugin

    ProvidePlugin 可以自动加载当前模块依赖的其他模块并以指定别名注入到当前模块中。假如当前模块依赖 jQuery 模块,同时我们想在模块中直接用 “$” 引用 jQuery 对象,但是不想手动 require jquery 模块。代码示例如下:

     // 当前模块
     $("#item")
    

    此时我们只需要在 Webpack 配置文件中配置 ProvidePlugin 插件将 jquery 模块导出为 $ 变量即可。代码示例如下:

     // webpack.config.js
     var webpack = require('webpack');
     module.exports = {
         ...
         ...
         plugins: [
             // 自动引入 jquery 模块并导出为 $ 变量,
             // 使各个模块可以直接通过 $ 来引用 jquery 对象
             new webpack.ProvidePlugin({
                 $: "jquery"
             })
         ],
         ...
     }
上一篇 下一篇

猜你喜欢

热点阅读