解析ECMAScript

尽管我们在前面的例子中,没有配置babel-loader,照样可以打包。

我们可以通过配置babel-loader可以将ES6代码转化为ES5,我们首先需要安装:

  1. npm i @babel/core @babel/preset-env babel-loader -D

让代码对js都预先使用babel解析

  1. // webpack.config.js
  2. module.exports = {
  3. module: {
  4. rules: [{
  5. test: /\.js$/, use: 'babel-loader'
  6. }]
  7. }
  8. }

balbel-loader会去项目文件夹下寻找 .babelrc 文件用于确认使用何种规则来解析ECMAScript

  1. {
  2. "presets": [
  3. "@babel/preset-env"
  4. ]
  5. }

执行 npm run build 成功,可见配置生效了,let变成了var,箭头函数变成了普通函数。

注:尽管我们使用了babel-loader,但是一些数据结构比如PromiseSet,在转换后对代码中仍旧保留了原始写法。如果我们想让低版本浏览器也正常工作,需要安装 @babel/polyfill,并且在使用这些数据结构的代码中引入 import '@babel/polyfill;,这样一来打包的文件就会打了很多。

参考提交:100dc90

解析React JSX

要解析React JSX,需要安装:

  1. npm i react react-dom @babel/preset-react -D

并在 .babelrc 中增加配置项

  1. {
  2. "presets": [
  3. "@babel/preset-env",
  4. "@babel/preset-react"
  5. ]
  6. }

然后编写一个使用React的例子

  1. // src/index.js
  2. import React from 'react';
  3. import ReactDOM from 'react-dom';
  4. class Search extends React.Component {
  5. render() {
  6. return <div>Search Component</div>
  7. }
  8. }
  9. ReactDOM.render(
  10. <Search/>,
  11. document.getElementById('root')
  12. )

最后修改dist/html,增加一个用于挂载的#root。
注:后续的提交,因为dist目录被忽略提交,checkout以后要运行需要手动添加 dist/index.html。

  1. <div id="root"></div>

执行 npm run build后,打开 dist/index.html 可以看到内容被成功渲染了。

参考节点:260ab8a

解析CSS

需要被依赖的两个loader,分别是 css-loader,style-loader

  • css-loader 用于解析.css文件,转化成commonjs对象
  • style-loader 将样式通过<style>标签插入到head中

安装它们后,在配置文件中增加对css文件的rule

  1. npm i css-loader style-loader -D
  1. {
  2. test: /\.css$/, use: ['style-loader','css-loader']
  3. }

注:loader的解析顺序是从右到做,即先使用css-loader读取css文件,再用style-loader插入。

参考节点:2976d37

解析Less、Sass

解析less,需要安装后在loader的use中中增加一个less-loader即可

  1. npm i less less-loader -D
  1. {
  2. test: /\.less$/, use: ['style-loader','css-loader', 'less-loader']
  3. }

解析scss也是同理,安装后在loader的use中增加sass-loader的处理即可

  1. npm i sass-loader node-sass -D
  1. {
  2. test: /\.sass$/, use: ['style-loader','css-loader', 'sass-loader']
  3. }

扩展:https://nordschool.com/css-in-react/ 总结了在React中使用CSS的若干中方式。

参考节点:f6f2213

解析图片

  1. npm install file-loader -D
  1. {
  2. test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader'
  3. }

拷贝图片logo.jpg到src文件夹下,然后在 search.js中引入使用

  1. // 省略了无关代码
  2. import logo from './logo.jpg';
  3. class Search extends React.Component {
  4. render() {
  5. return <div>
  6. <img src={logo} />
  7. Search Component
  8. </div>
  9. }
  10. }

参考节点:3eef4d0

解析字体

仍旧使用file-loader来解析字体,先在自己项目文件夹下面寻找到一个字体文件 fontawesome-webfont.woff 拷贝到src目录下,然后修改css引用该字体文件:

  1. @font-face {
  2. font-family: 'awesome';
  3. src: url("./fontawesome-webfont.woff");
  4. }
  5. div {
  6. font-size: 20px;
  7. color: red;
  8. font-family: 'awesome';
  9. }

然后在配置文件中增加对字体文件格式的解析:

  1. {
  2. test: /\.(woff|woff2|eot|ttf|otf)$/,
  3. use: ['file-loader']
  4. }

注:随便拷贝的图标字体未必会有效果,因为必须出现对应字符才能到效果。

使用url-loader

url-loader内部也是使用的file-loader,可以处理图片和字体,可以针对较小资源自动base64

同样是加载图片,我们尝试用url-loader加载,并将大小比10Kb小的图片都加载为base64

  1. {
  2. test: /\.(png|jpe?g|gif)$/i,
  3. use: [{
  4. loader: 'url-loader',
  5. options: {
  6. limit: 10240
  7. }
  8. }]
  9. }

执行打包命令,可以发现没有打包出来图片文件,而是js文件大小变大了。