1.webpack基础配置与loader的基础应用

写在开头

该系列文章主要是本人在学习慕课网React全栈课程中的一些记录和分享。该课程主要是利用React构建cnode网站,接口由cnode官方提供。由于课程中的webpack,babel版本较老,本次分享均是用的webpack4和Babel7。本系列文章重点不是React,主要是分享前端工程化的构建和服务端渲染(SSR)。

本次分享的代码将会放到我的github上面。

工程初始化和webpack基础配置

新建项目文件夹,在cmd窗口中运行npm init,输入一些配置项后即可生成一个npm项目。运行git init,对该项目进行git版本管理。在项目中新建build和client文件夹,build文件夹存放webpack配置文件,client文件夹存放客户端的开发文件。

首先安装基础的依赖React和Webpack。

npm i react -S   
npm i webpack -D   // -D为开发依赖
npm i webpack-cli -D  // webpack4,需要安装cli依赖

新建一些文件

  • build/webpack.config.js // webpack配置文件
  • client/app.js // 项目的入口文件
  • client/App.jsx // react入口文件

webpack基础配置,详细配置可参照官网

const path = require('path')  // path包解决不同操作系统中路径不一致问题

function resolvePath(filePath) {
  return path.join(__dirname, filePath);
}

module.exports = {
  mode: 'development', // 开发模式或生产模式
  // 入口文件,webpack编译的入口
  entry: {
    app: resolvePath('../client/app.js')
  },
  // 打包后文件的输出地址
  output: {
    filename: '[name].[hash].js', //name和hash是其中的两个变量
    path: resolvePath('../dist'), // 打包后文件的位置
    publicPath: '' //
  }
}

webpack基本配置完成了,在package.json中的scripts中增加一个build命令

"scripts": {
    "build": "webpack --config build/webpack.config.js"
  },

在app.js中随便写一点内容,在cmd中运行npm run build,在当前文件夹下会生成一个dist目录,该目录下即为经webpack编译后的文件。该部分代码位于仓库的2-3分支下

如果初始化git后,在项目下添加 .gitignore 文件,用来配置不需要版本管理的文件夹或文件,如node_modules等

babel-loader及babel的配置

由于在项目中用到ES6和jsx语法,所有需要用babel先编译。babel-loader也是react官方的编译器。我们现在app和App文件中写一些简单的内容。

App.jsx
    import React from 'react'
    // 一个简单的react组件
    export default class App extends React.Component {
      render() {
        return (
          <div>This is app</div>
        )
      }
    }
app.js
    //将App.jsx中的组件挂载到body上(仅作演示,不建议挂载到body上)
    import React from 'react'
    import ReactDOM from 'react-dom'
    
    import App from './App'
    
    ReactDOM.render(<App />, document.body)

配置webpack中的loader,loader主要是转换代码的作用,如将jsx代码转为js代码。我们需要安装babel-loader,@babel/core和@babel/preset-react三个依赖,均用-D安装。

resolve: {
    extensions: ['.js','.jsx']  // 默认文件后缀。在app.js中,直接引入App,而不是App.jsx。所有的js和jsx文件在引入时均可省略后缀
  },
  // 配置loader
  module: {
    rules: [
      {
        test: /.jsx$/,  // 正则,处理以.jsx结尾的文件
        loader: 'babel-loader'  // 使用的loader
      },
      {
        test: /js$/, // 主要是将ES6或更高级别的无法转为ES5版本
        loader: 'babel-loader',
        exclude: [
          resolvePath('../node_modules') // 忽略node_modules中的文件
        ]
      }
    ]
  },

配置完webpack后,babel还没有生效。需要在项目中新建一个.babelrc文件,配置项如下。

// babel7的配置比较简洁,直接使用官方的preset-react即可。
{
  "presets": ["@babel/preset-react"]
}

运行npm run build命令,新生成的js文件就会包含react相关的代码了。

目前生成的文件均为js文件,并没有html文件的生成。我们之需要安装html-webpack-plugin,然后再webpack中配置即可

const HTMLPlugin = require('html-webpack-plugin')

modeule.exports = {
    //.........
   plugins: [
    new HTMLPlugin()
  ]
}

再次运行build命令后,会再dist目录下生成一个index.html文件,打开即可看见我们再App.jsx中的内容。该部分代码位于仓库的2-4分支下

相关推荐