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

写在开头

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

本次分享的代码将会放到个人github上面。前端

工程初始化和webpack基础配置

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

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

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

新建一些文件webpack

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

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

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命令github

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

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

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

babel-loader及babel的配置

因为在项目中用到ES6和jsx语法,全部须要用babel先编译。babel-loader也是react官方的编译器。咱们如今app和App文件中写一些简单的内容。json

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分支下

相关文章
相关标签/搜索