实战webpack系列03

03.Webpack的强大功能

1、生成Source Maps(使调试更容易)

经过简单的配置,webpack就能够在打包时为咱们生成的source maps,这为咱们提供了一种对应编译文件和源文件的方法,使得编译后的代码可读性更高,也更容易调试。css

须要配置devtool,它有如下四种不一样的配置选项,各具优缺点,描述以下:html

devtool选项 配置结果
source-map 在一个单独的文件中产生一个完整且功能彻底的文件。这个文件具备最好的source map,可是它会减慢打包速度;
cheap-module-source-map 在一个单独的文件中生成一个不带列映射的map,不带列映射提升了打包速度,可是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试形成不便;
eval-source-map 使用eval打包源文件模块,在同一个文件中生成干净的完整的source map。这个选项能够在不影响构建速度的前提下生成完整的sourcemap,可是对打包后输出的JS文件的执行具备性能和安全的隐患。在开发阶段这是一个很是好的选项,在生产阶段则必定不要启用这个选项;
cheap-module-eval-source-map 这是在打包文件时最快的生成source map的方法,生成的Source Map 会和打包后的JavaScript文件同行显示,没有列映射,和eval-source-map选项具备类似的缺点;

正如上表所述,上述选项由上到下打包速度愈来愈快,不过同时也具备愈来愈多的负面做用,较快的打包速度的后果就是对打包后的文件的的执行有必定影响。node

对小到中型的项目中,eval-source-map是一个很好的选项,再次强调你只应该开发阶段使用它,咱们继续对上文新建的webpack.config.js,进行以下配置:react

module.exports = {
  devtool: 'eval-source-map',
  entry:  __dirname + "/app/main.js",
  output: {
    path: __dirname + "/public",
    filename: "bundle.js"
  }
}

cheap-module-eval-source-map方法构建速度更快,可是不利于调试,推荐在大型项目考虑时间成本时使用。webpack

2、使用webpack构建本地服务器

浏览器监听你的代码的修改,在webpack中进行配置以前须要单独安装它做为项目依赖es6

npm install --save-dev webpack-dev-server

devserver做为webpack配置选项中的一项,如下是它的一些配置选项,更多配置可参考web

devserver的配置选项 功能描述
contentBase 默认webpack-dev-server会为根文件夹提供本地服务器,若是想为另一个目录下的文件提供本地服务器,应该在这里设置其所在目录(本例设置到“public"目录
port 设置默认监听端口,若是省略,默认为”8080“
inline 设置为true,当源文件改变时会自动刷新页面
historyApiFallback 在开发单页应用时很是有用,它依赖于HTML5 history API,若是设置为true,全部的跳转将指向index.html

把这些命令加到webpack的配置文件中,如今的配置文件webpack.config.js以下所示正则表达式

module.exports = {
  devtool: 'eval-source-map',

  entry:  __dirname + "/app/main.js",
  output: {
    path: __dirname + "/public",
    filename: "bundle.js"
  },

  devServer: {
    contentBase: "./public",//本地服务器所加载的页面所在的目录
    historyApiFallback: true,//不跳转
    inline: true//实时刷新
  } 
}

在package.json中的scripts对象中添加以下命令,用以开启本地服务器:npm

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack",
    "server": "webpack-dev-server --open"
  },

在终端中输入npm run server便可在本地的8080端口查看结果
开启本地服务器json

3、Loaders

Loaders是webpack提供的最激动人心的功能之一了。经过使用不一样的loader,webpack有能力调用外部的脚本或工具,实现对不一样格式的文件的处理,好比说分析转换scss为css,或者把下一代的JS文件(ES6,ES7)转换为现代浏览器兼容的JS文件,对React的开发而言,合适的Loaders能够把React的中用到的JSX文件转换为JS文件。

Loaders须要单独安装而且须要在webpack.config.js中的modules关键字下进行配置,

Loaders的配置包括如下几方面:

  • test:一个用以匹配loaders所处理文件的拓展名的正则表达式(必须)
  • loader:loader的名称(必须)
  • include/exclude:手动添加必须处理的文件(文件夹)或屏蔽不须要处理的文件(文件夹)(可选);

不过在配置loader以前,咱们把Greeter.js里的问候消息放在一个单独的JSON文件里,并经过合适的配置使Greeter.js能够读取该JSON文件的值,各文件修改后的代码以下:

在app文件夹中建立带有问候信息的JSON文件(命名为config.json)

{
  "greetText": "Hi there and greetings from JSON!"
}

更新后的Greeter.js

var config = require('./config.json');

module.exports = function() {
  var greet = document.createElement('div');
  greet.textContent = config.greetText;
  return greet;
};

注 因为webpack3./webpack2.已经内置可处理JSON文件,这里咱们无需再添加webpack1.*须要的json-loader。在看如何具体使用loader以前咱们先看看Babel是什么?

4、Babel

Babel实际上是一个编译JavaScript的平台,它能够编译代码帮你达到如下目的:

  • 让你能使用最新的JavaScript代码(ES6,ES7...),而不用管新标准是否被当前使用的浏览器彻底支持;
  • 让你能使用基于JavaScript进行了拓展的语言,好比React的JSX;
4.1. Babel的安装与配置

Babel实际上是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack能够把其不一样的包整合在一块儿使用,对于每个你须要的功能或拓展,你都须要安装单独的包(用得最多的是解析Es6的babel-env-preset包和解析JSX的babel-preset-react包)。

咱们先来一次性安装这些依赖包

// npm一次性安装多个依赖模块,模块之间用空格隔开
npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-react

在webpack中配置Babel的方法以下:

module.exports = {
    entry: __dirname + "/app/main.js",//已屡次说起的惟一入口文件
    output: {
        path: __dirname + "/public",//打包后的文件存放的地方
        filename: "bundle.js"//打包后输出文件的文件名
    },
    devtool: 'eval-source-map',
    devServer: {
        contentBase: "./public",//本地服务器所加载的页面所在的目录
        historyApiFallback: true,//不跳转
        inline: true//实时刷新
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: [
                            "env", "react"
                        ]
                    }
                },
                exclude: /node_modules/
            }
        ]
    }
};

如今你的webpack的配置已经容许你使用ES6以及JSX的语法了。继续用上面的例子进行测试,不过此次咱们会使用React,记得先安装 React 和 React-DOM

npm install --save react react-dom

接下来咱们使用ES6的语法,更新Greeter.js并返回一个React组件

//Greeter,js
import React, {Component} from 'react'
import config from './config.json';

class Greeter extends Component{
  render() {
    return (
      <div>
        {config.greetText}
      </div>
    );
  }
}

export default Greeter

修改main.js以下,使用ES6的模块定义和渲染Greeter模块

// main.js
import React from 'react';
import {render} from 'react-dom';
import Greeter from './Greeter';

render(<Greeter />, document.getElementById('root'));

从新使用npm start打包,若是以前打开的本地服务器没有关闭,你应该能够在localhost:8080下看到与以前同样的内容,这说明react和es6被正常打包了

localhost:8080

4.2 Babel的配置

Babel其实能够彻底在 webpack.config.js 中进行配置,可是考虑到babel具备很是多的配置选项,在单一的webpack.config.js文件中进行配置每每使得这个文件显得太复杂,所以一些开发者支持把babel的配置选项放在一个单独的名为 ".babelrc" 的配置文件中

module.exports = {
    entry: __dirname + "/app/main.js",//已屡次说起的惟一入口文件
    output: {
        path: __dirname + "/public",//打包后的文件存放的地方
        filename: "bundle.js"//打包后输出文件的文件名
    },
    devtool: 'eval-source-map',
    devServer: {
        contentBase: "./public",//本地服务器所加载的页面所在的目录
        historyApiFallback: true,//不跳转
        inline: true//实时刷新
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader"
                },
                exclude: /node_modules/
            }
        ]
    }
};
//.babelrc
{
  "presets": ["react", "env"]
}

到目前为止,咱们已经知道了,对于模块,Webpack能提供很是强大的处理功能

相关文章
相关标签/搜索