webpack入门详细教程(二)

webpack admin 暂无评论

Babel

Babel其实是一个编译JavaScript的平台,它的强大之处表现在可以通过编译帮你达到以下目的:

  • 下一代的JavaScript标准(ES6,ES7),这些标准目前并未被当前的浏览器完全的支持;

  • 使用基于JavaScript进行了拓展的语言,比如React的JSX

Babel的安装与配置

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

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

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

在webpack中配置Babel的方法如下

1.module.exports = {
2.  devtool: 'eval-source-map',
3.
4.  entry:  __dirname + "/app/main.js",
5.  output: {
6.    path: __dirname + "/public",
7.    filename: "bundle.js"
8.  },
9.
10.  module: {
11.    loaders: [
12.      {
13.        test: /\.json$/,
14.        loader: "json"
15.      },
16.      {
17.        test: /\.js$/,
18.        exclude: /node_modules/,
19.        loader: 'babel',//在webpack的module部分的loaders里进行配置即可
20.        query: {
21.          presets: ['es2015','react']
22.        }
23.      }
24.    ]
25.  },
26.
27.  devServer: {
28.    contentBase: "./public",
29.    colors: true,
30.    historyApiFallback: true,
31.    inline: true
32.  }
33.}

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

1.npm install --save react react-dom

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

1.//Greeter,js
2.import React, {Component} from 'react'
3.import config from './config.json';
4.
5.class Greeter extends Component{
6.  render() {
7.    return (
8.      


9.        {config.greetText}
10.      


11.    );
12.  }
13.}
14.
15.export default Greeter

使用ES6的模块定义和渲染Greeter模块

1.import React from 'react';
2.import {render} from 'react-dom';
3.import Greeter from './Greeter';
4.
5.render(, document.getElementById('root'));

Babel的配置选项

Babel其实可以完全在webpack.config.js中进行配置,但是考虑到babel具有非常多的配置选项,在单一的webpack.config.js文件中进行配置往往使得这个文件显得太复杂,因此一些开发者支持把babel的配置选项放在一个单独的名为 “.babelrc” 的配置文件中。我们现在的babel的配置并不算复杂,不过之后我们会再加一些东西,因此现在我们就提取出相关部分,分两个配置文件进行配置(webpack会自动调用.babelrc里的babel配置选项),如下:

1.// webpack.config.js
2.module.exports = {
3.  devtool: 'eval-source-map',
4.
5.  entry:  __dirname + "/app/main.js",
6.  output: {
7.    path: __dirname + "/public",
8.    filename: "bundle.js"
9.  },
10.
11.  module: {
12.    loaders: [
13.      {
14.        test: /\.json$/,
15.        loader: "json"
16.      },
17.      {
18.        test: /\.js$/,
19.        exclude: /node_modules/,
20.        loader: 'babel'
21.      }
22.    ]
23.  },
24.
25.  devServer: {...} // Omitted for brevity
26.}
1.//.babelrc
2.{
3.  "presets": ["react", "es2015"]
4.}

到目前为止,我们已经知道了,对于模块,Webpack能提供非常强大的处理功能,那那些是模块呢。

一切皆模块

Webpack有一个不可不说的优点,它把所有的文件都可以当做模块处理,包括你的JavaScript代码,也包括CSS和fonts以及图片等等等,只有通过合适的loaders,它们都可以被当做模块被处理。

CSS

webpack提供两个工具处理样式表,css-loader 和 style-loader,二者处理的任务不同,css-loader使你能够使用类似@import 和 url(…)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。

继续上面的例子

1.//安装
2.npm install --save-dev style-loader css-loader
1.//使用
2.module.exports = {
3.  devtool: 'eval-source-map',
4.
5.  entry:  __dirname + "/app/main.js",
6.  output: {
7.    path: __dirname + "/build",
8.    filename: "bundle.js"
9.  },
10.
11.  module: {
12.    loaders: [
13.      {
14.        test: /\.json$/,
15.        loader: "json"
16.      },
17.      {
18.        test: /\.js$/,
19.        exclude: /node_modules/,
20.        loader: 'babel'
21.      },
22.      {
23.        test: /\.css$/,
24.        loader: 'style!css'//添加对样式表的处理
25.      }
26.    ]
27.  },
28.
29.  devServer: {...}
30.}

注:感叹号的作用在于使同一文件能够使用不同类型的loader

接下来,在app文件夹里创建一个名字为”main.css”的文件,对一些元素设置样式

1.html {
2.  box-sizing: border-box;
3.  -ms-text-size-adjust: 100%;
4.  -webkit-text-size-adjust: 100%;
5.}
6.
7.*, *:before, *:after {
8.  box-sizing: inherit;
9.}
10.
11.body {
12.  margin: 0;
13.  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
14.}
15.
16.h1, h2, h3, h4, h5, h6, p, ul {
17.  margin: 0;
18.  padding: 0;
19.}

你还记得吗?webpack只有单一的入口,其它的模块需要通过 import, require, url等导入相关位置,为了让webpack能找到”main.css“文件,我们把它导入”main.js “中,如下

1.//main.js
2.import React from 'react';
3.import {render} from 'react-dom';
4.import Greeter from './Greeter';
5.
6.import './main.css';//使用require导入css文件
7.
8.render(, document.getElementById('root'));

通常情况下,css会和js打包到同一个文件中,并不会打包为一个单独的css文件,不过通过合适的配置webpack也可以把css打包为单独的文件的。

不过这也只是webpack把css当做模块而已,咱们继续看看一个真的CSS模块的实践。

CSS module

在过去的一些年里,JavaScript通过一些新的语言特性,更好的工具以及更好的实践方法(比如说模块化)发展得非常迅速。模块使得开发者把复杂的代码转化为小的,干净的,依赖声明明确的单元,且基于优化工具,依赖管理和加载管理可以自动完成。

不过前端的另外一部分,CSS发展就相对慢一些,大多的样式表却依旧是巨大且充满了全局类名,这使得维护和修改都非常困难和复杂。

最近有一个叫做 CSS modules 的技术就意在把JS的模块化思想带入CSS中来,通过CSS模块,所有的类名,动画名默认都只作用于当前模块。Webpack从一开始就对CSS模块化提供了支持,在CSS loader中进行配置后,你所需要做的一切就是把”modules“传递都所需要的地方,然后就可以直接把CSS的类名传递到组件的代码中,且这样做只对当前组件有效,不必担心在不同的模块中具有相同的类名可能会造成的问题。具体的代码如下

1.module.exports = {
2.  devtool: 'eval-source-map',
3.
4.  entry:  __dirname + "/app/main.js",
5.  output: {...},
6.
7.  module: {
8.    loaders: [
9.      {
10.        test: /\.json$/,
11.        loader: "json"
12.      },
13.      {
14.        test: /\.js$/,
15.        exclude: /node_modules/,
16.        loader: 'babel'
17.      },
18.      {
19.        test: /\.css$/,
20.        loader: 'style!css?modules'//跟前面相比就在后面加上了?modules
21.      }
22.    ]
23.  },
24.
25.  devServer: {...}
26.}

创建一个Greeter.css文件

1..root {
2.  background-color: #eee;
3.  padding: 10px;
4.  border: 3px solid #ccc;
5.}

导入.root到Greeter.js中

1.import React, {Component} from 'react';
2.import config from './config.json';
3.import styles from './Greeter.css';//导入
4.
5.class Greeter extends Component{
6.  render() {
7.    return (
8.      <div className={styles.root}>//添加类名
9.        {config.greetText}
10.      div>

11.    );
12.  }
13.}
14.
15.export default Greeter

放心使用把,相同的类名也不会造成不同组件之间的污染。

CSS modules 也是一个很大的主题,有兴趣的话可以去官方文档查看更多消息

CSS预处理器

Sass 和 Less之类的预处理器是对原生CSS的拓展,它们允许你使用类似于variables, nesting, mixins, inheritance等不存在于CSS中的特性来写CSS,CSS预处理器可以这些特殊类型的语句转化为浏览器可识别的CSS语句,

你现在可能都已经熟悉了,在webpack里使用相关loaders进行配置就可以使用了,以下是常用的CSS 处理loaders

  • Less Loader

  • Sass Loader

  • Stylus Loader

不过其实也存在一个CSS的处理平台-PostCSS,它可以帮助你的CSS实现更多的功能,在其CSS官方文档可了解更多相关知识。

举例来说如何使用PostCSS,我们使用PostCSS来为CSS代码自动添加适应不同浏览器的CSS前缀。

首先安装postcss-loader 和 autoprefixer(自动添加前缀的插件)

1.npm install --save-dev postcss-loader autoprefixer

接下来,在webpack配置文件中进行设置,只需要新建一个postcss关键字,并在里面申明依赖的插件,如下,现在你写的css会自动根据Can i use里的数据添加不同前缀了。

1.//webpack配置文件
2.module.exports = {
3.  devtool: 'eval-source-map',
4.  entry: __dirname + "/app/main.js",
5.  output: {...},
6.
7.  module: {
8.    loaders: [
9.      {
10.        test: /\.json$/,
11.        loader: "json"
12.      },
13.      {
14.        test: /\.js$/,
15.        exclude: /node_modules/,
16.        loader: 'babel'
17.      },
18.      {
19.        test: /\.css$/,
20.        loader: 'style!css?modules!postcss'
21.      }
22.    ]
23.  },
24.
25.  postcss: [
26.    require('autoprefixer')//调用autoprefixer插件
27.  ],
28.
29.  devServer: {...}
30.}

到现在,本文已经涉及到处理JS的Babel和处理CSS的PostCSS,它们其实也是两个单独的平台,配合Webpack可以很好的发挥它们的作用。接下来介绍Webpack中另一个非常重要的功能-Plugins


转载请注明: Vue教程中文网 - 打造国内领先的vue学习网站-vue视频,vue教程,vue学习,vue培训 » webpack入门详细教程(二)

喜欢 ()or分享