基于webpack4+和react16+从零开始搭建脚手架 (一)

501 阅读3分钟

一:初始化项目

  mkdir webpack-react 创建项目目录
  cd  webpack-react 转到项目目录
  npm init -y 初始化项目,并全部确定

二:安装node,npm

windows 去node.js官网下载安装包直接安装
linux和mac mac和Linux直接命令行安装nvm install v10.15.3
检查是否安装成功node -v, npm -v

三:安装webpack和webpack-cli

npm install --save-dev webpack@4.15.1 webpack-cli 

四:创建项目文件

新建目录src,新建index.html和index.js

index.js

var element =document.getElementById('root');
element.innerHTML = 'hello, world!';

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>从零搭建react项目</title>
</head>
<body>
  <div id="root"></div>
  <script src="../dist/vender.js"></script>
</body>
</html>

新建目录build,新建文件webpack.config.js

webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js',  //打包入口文件
  output: {
    filename: 'vender.js', //打包生成的文件
    path: path.resolve(__dirname, '../dist')  //打包生成文件的存放目录
  }
};

现在的目录文件看起来是这样

build
   --webpack.config.js  webpack默认配置文件
src
   --index.html 静态文件
   --index.js 打包入口文件
node_modules node 依赖包目录  
package-lock.json webpack基本插件和依赖的版本号和信息
package.json 项目目录的详细描述

接下去我们要通过执行webpack命令,来编译我们的代码,生成vender.js。

webpack --config build/webpack.config.js

编译完成后,刷新根目录,可以看到已经生成dist文件夹和vender.js文件。 用浏览器打开html文件,你会看到hello word。我们成功通过webpack编译了js文件,并且没有出现问题。

webpack --config build/webpack.config.js命令,我们可以通过npm scripts管理起来。 在package.json文件,我们为scripts属性配置一个build命令,其值为:webpack --config build/webpack.config.js,以下是scripts的相关代码:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config build/webpack.config.js"
  }

然后在命令行中运行npm run build 生成以下机构目录

五:安装react和react-dom

在终端输入以下命令

npm install --save-dev react react-dom

安装成功后,我们在项目使用react,我们直接修改src目录下的index.js的代码,我们用react来插入这句hello world!

import React from "react";
import ReactDom from "react-dom";

ReactDom.render(
    <h1>hello,word!</h1>,
    document.getElementById('root')
);

好了,我们再编译试试看。

npm run build

失败了?对不对!首先,我告诉你这段代码没有任何问题为什么会失败?因为webpack只识别JavaScript文件,而且只能编译es5版本的JavaScript语法。实际上,我们使用ES2015,以及jsx的语法糖,webpack它根本不认识啊。怎么办?webpack 可以使用 loader 来预处理文件。它不仅仅可以处理JavaScript本身,还允许你打包任何的静态资源。 其中,babel-loader,就是这样一个预处理插件,它加载 ES2015+ 代码,然后使用 Babel 转译为 ES5。我们来了解下如何在webpack配置babel-loader。

首先安装babel相关的模块:

npm install --save-dev babel-loader @babel/preset-react @babel/preset-env @babel/core

除了babel-loader,我们还安装了好多的包,其中@babel/core是babel的核心模块,@babel/preset-env是转译ES2015+的语法,@babel/preset-react是转译react的JSX以及FLOW。

第二步,你需要在根目录建立一个.babelrc的文件,配置相关的presets:

{
      "presets": [
        [
          "@babel/preset-env",
          {
            "targets": {
              "browsers": [
                "> 1%",
                "last 5 versions",
                "ie >= 8"
              ]
            }
          }
        ],
        "@babel/preset-react"
      ]
    }

第三步,修改webpack.config.js文件。

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'vender.js',
    path: path.resolve(__dirname, '../dist')
  },
  module: {
      rules:[
          {
              test: /\.js?$/,
              use:"babel-loader"
          }
      ]
  }
};

在 webpack 配置中定义 loader 时,要定义在 module.rules 中。其中,test和use属性是必须的。include属性,定义了rules执行的范围。这告诉 webpack 编译器如下信息: 嘿,webpack 编译器,你在编译文件过程中,如果这个是在app目录下的js文件,在你对它打包之前,先使用 babel-loader 转换一下。

重新执行本地编译

npm run build

这次不再报错,编译成功。 好了,再次打开src目录的index.html,页面成功显示了hello world。