资讯专栏INFORMATION COLUMN

从0开始配置webpack和搭建一个React项目

davidac / 2482人阅读

摘要:先来说说搭建官方文档上也有提供直接下载包,但是修改配置比较麻烦修改配置需要执行自行搭建一个项目并且配置主要记录学习阶段总结的可能不太好,勉强看看,重点记录一下第二种的方式通过管理包下载官网链接安装步骤都有的在项目目录下,执行会出

先来说说react搭建:
1 官方文档上也有提供直接下载react包,但是修改webpack配置比较麻烦

npx create-react-app my-app
cd my-app
npm start

修改webpack配置需要执行

npm run eject

2 自行搭建一个项目并且配置webpack--主要记录学习阶段~总结的可能不太好,勉强看看,重点记录一下第二种的方式

通过yarn管理包
 

下载yarn

yarn官网链接安装步骤都有的

在项目目录下,执行yarn init

会出现我们的package.json文件

安装webpack

yarn add webpack --dev

新建webpack.config.js文件,

贴官网示例:

       const path = require("path");
       module.exports = {
         entry: "./src/app.js",
         output: {
           path: path.resolve(__dirname, "dist"),
           filename: "app.js"
         }
       };

命令行执行webpack会发现dist目录

注意:yarn安装过程中如果出错,尝试将yarn切换到淘宝镜像再进行下载哦~,我安装过程中出现过问题,切到这就没问题了
yarn config set registry "https://registry.npm.taobao.org"

安装html-webpack-plugin

yarn add html-webpack-plugin --dev

文档使用链接地址
按照文档操作,修改webpack.config.js使用html-webpack-plugin打包html文件
再次执行webpack命令,会发现dist文件夹下面多了一个index.html
设置html-webpack-plugin的template模版,在src新建index.html,并且设置html内容

  
    const path = require("path");
    var HtmlWebpackPlugin = require("html-webpack-plugin");
    module.exports = {
      entry: "./src/app.js",
      output: {
        path: path.resolve(__dirname, "dist"),
        filename: "app.js"
      },
      plugins: [new HtmlWebpackPlugin(
        {
            template:"./src/index.html"
        }
      )]
    };

现在dist文档下面的index.html就是当前src下的index.html的模版了

安装babel

yarn add babel-loader @babel/core @babel/preset-env

具体详情见文档地址 在src/app.js中写入一些ES6语法,再次执行webpack命令,dist/app.js进行了转换

安装react转换 babel-preset-react

yarn add babel-preset-react --dev

修改webpack.config.js

   const path = require("path");
   var HtmlWebpackPlugin = require("html-webpack-plugin");
   module.exports = {
     entry: "./src/app.jsx"
       path: path.resolve(__dirname, "dist"),
       filename: "app.js"
     },
     plugins: [new HtmlWebpackPlugin(
       {
           template:"./src/index.html"
       }
     )],
     module: {
       rules: [
         {
           test: /.m?jsx$/,
           exclude: /(node_modules|bower_components)/,
           use: {
             loader: "babel-loader",
             options: {
               presets: ["@babel/preset-env","react"]
             }
           }
         }
       ]
     }
   };

安装react
yarn add react react-dom
react添加操作地址详情
将src/app.js修改为app.jsx

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

   ReactDOM.render(
     

Hello, world!

, document.getElementById("app") );

再执行webpack进行打包
如果出现Error: Plugin/Preset files are not allowed to export objects, only functions.错误

说明babel的版本不一致,我这边是因为"babel-preset-react": "^6.24.1"默认装的6版本,其他babel安装的是7版本,所以统一升级到7或者降级到6

yarn add babel-preset-react@7.0.0 --dev

这样在进行打包,就可以了,这个时候打开dist/index.html我们看到hello, world!说成功编译了react

安装style-loader

yarn add css-loader style-loader --dev
安装地址操作详情
在webpack.config.js的rules中添加

 {
   test: /.css$/,
   use: ["style-loader", "css-loader"],
 },

在src下新建一个文件index.css,随便修改一点样式

   h1{
       color:#F00;
   }

在app.jsx中引入

   import "./index.css"

再次执行webpack打包,刷新dist/index.html

安装ExtractTextWebpackPlugin插件将css独立到多带带的文件

   yarn add extract-text-webpack-plugin --dev

官网链接地址

   const path = require("path");
   var HtmlWebpackPlugin = require("html-webpack-plugin");
   const ExtractTextPlugin = require("extract-text-webpack-plugin");
   module.exports = {
       entry: "./src/app.jsx",
       output: {
           path: path.resolve(__dirname, "dist"),
           filename: "app.js"
       },
       module: {
           rules: [
           {
               test: /.m?jsx$/,
               exclude: /(node_modules|bower_components)/,
               use: {
               loader: "babel-loader",
               options: {
                   presets: ["@babel/preset-env","react"]
               }
               }
           },
           {
               test: /.css$/,
               use: ExtractTextPlugin.extract({
                   fallback: "style-loader",
                   use: "css-loader"
               })
           },
           ]
       },
       plugins: [
           new HtmlWebpackPlugin(
               {
                   template:"./src/index.html"
               }
           ),
           new ExtractTextPlugin("index.css"),
       ],
   };

webpack.config.js配置如上
再次执行webpack,dist目录下就多了一个index.css了~
注意:打包遇到Tapable.plugin is deprecated. Use new API on .hooks instead错误,原因是extract-text-webpack-plugin目前版本不支持webpack4
执行:yarn add extract-text-webpack-plugin@next --dev

安装sass-loader

   yarn add sass-loader --dev

在webpack.config.js中rules添加

   {
       test: /.scss$/,
       use: ExtractTextPlugin.extract({
           fallback: "style-loader",
           use: ["css-loader", "sass-loader"]
       })
   }

新建一个index.scss文件

   body{
       background: #ccc;
       #app{
           font-size: 22px;
       }
   }

在执行webpack会出现报错Cannot find module "node-sass"
查看文档链接
需要安装node-sass

   yarn add node-sass --dev

打包,查看index.html可以看到样式应用上去了~

安装url-loader处理图片链接

   yarn add url-loader file-loader --dev

官网地址
在rules中加入:

   {
       test: /.(png|jpg|gif)$/i,
       use: [
         {
           loader: "url-loader",
           options: {
             limit: 8192
           }
         }
       ]
   }

项目中引入图片,进行打包,这样图片资源也打包解析进去了~

添加解析字体rule

  {
       test: /.(eot|svg|ttf|woff|woff2|otf)$/i,
       use: [
           {
             loader: "url-loader",
             options: {
               limit: 8192,
               name:"resource/[name].[ext]"
             }
           }
       ]
   },

添加webpack-dev-server

   yarn add webpack-dev-server --dev

修改package.json添加
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"watch": "webpack --watch",
"start": "webpack-dev-server --open",
"build": "webpack-cli"
}
执行yarn run start启动项目

yarn run build打包项目

最后附上当前为止修改后的webpack.config.js

       const path = require("path");
       const webpack = require("webpack");
       var HtmlWebpackPlugin = require("html-webpack-plugin");
       const ExtractTextPlugin = require("extract-text-webpack-plugin");
       module.exports = {
           entry: "./src/app.jsx",
           output: {
               path: path.resolve(__dirname, "dist"),
               filename: "./js/[name].[hash].js",
               chunkFilename: "./js/[name].[hash].js",
           },
           devServer: {
               port: 8080,
               proxy: {
                   "/expo": {
                       target: "https://xxx",
                       changeOrigin: true,
                       pathRewrite: {
                           "/expo": "/expo",
                       },
                       secure: false,
                   },
               },
               hot:true
           },
           module: {
               rules: [
               {
                   test: /.m?jsx$/,
                   exclude: /(node_modules|bower_components)/,
                   use: {
                   loader: "babel-loader",
                   options: {
                       presets: ["@babel/preset-env","react"]
                   }
                   }
               },
               {
                   test: /.css$/,
                   use: ExtractTextPlugin.extract({
                       fallback: "style-loader",
                       use: "css-loader"
                   })
               },
               {
                   test: /.scss$/,
                   use: ExtractTextPlugin.extract({
                       fallback: "style-loader",
                       use: ["css-loader", "sass-loader"]
                   })
               },
               {
                   test: /.(png|jpg|gif|ico|jpeg)$/i,
                   use: [
                     {
                       loader: "url-loader",
                       options: {
                           limit: 8192,
                           name: "[name].[ext]",
                           publicPath: "../images/",
                           outputPath: "images/"
                       }
                     }
                   ]
               },
               {
                   test: /.(eot|svg|ttf|woff|woff2|otf)$/i,
                   use: [{
                       loader: "file-loader",
                       options: {
                         name: "[name].[ext]",
                         publicPath: "../fonts/",
                         outputPath: "fonts/"
                       }
                   }]
               },
               ]
           },
           plugins: [
               new HtmlWebpackPlugin(
                   {
                       template:"./src/index.html"
                   }
               ),
               new ExtractTextPlugin("css/[name].css"),
           ],
           optimization:{
               splitChunks:{
                   name:"common",
                   filename:"js/base.js"
               }
           }
       };

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103653.html

相关文章

  • 0开始使用webpack搭建react工作流

    摘要:另外一方面,即使不是想搭建自己的工作流,而是使用现成的脚手架,大家都会用。显然,彻底掌握如何从零开始搭建一个能够贴近实际项目的工作流,是一个想要满足工作最基本要求的人必备的技能。 很多人想搭建一套属于自己的前端工作流,最开始的时候我们的工作流萌芽是从写一个项目的时候,拷贝以前写过的一个项目文件夹改完直接使用开始的,后来使用了grunt和gulp,再到webpack,每一个前端人员想掌握...

    bingchen 评论0 收藏0
  • 学习开始搭建React脚手架

    摘要:写在前面准备学习一下和相关的东西,官方的脚手架看起来太繁琐,所以打算自己来搭建一个,参考了这个文档从零搭建全家桶框架教程步骤上都差不多第一步,依赖总览完成到我现在半成品的过程中,目前完成开发模式的相关操作,添加了按需加载的地步。 写在前面 准备学习一下react和webpack相关的东西,官方的脚手架看起来太繁琐,所以打算自己来搭建一个,参考了这个文档从零搭建React全家桶框架教程;...

    cod7ce 评论0 收藏0
  • 使用webpackbabel搭建react开发环境

    摘要:译文原文来自写在前面使用已经蛮长一段时间但是在新项目开始之际都是东拼西凑其他项目的配置来使用如果要自己从零开始写一个完整项目的配置估计得费死劲所以在发布版本之际正是时候来认真从零开始学习了是一个出自的库用于构建用户交互界面是一个非常厉害的有 译文,原文来自https://scotch.io/tutorials/s...写在前面,使用webpack已经蛮长一段时间,但是在新项目开始之际,...

    AZmake 评论0 收藏0
  • ? 使用 Dawn 快速搭建 React 项目

    摘要:开发一个项目,通常避免不了要去配置和之类,以支持或模块及各种新语法,及进行语法的转义。当然也可以用脚手架快速创建一个项目,但与此同时常常又显的不太自由。本文是一篇使用入门文章,介绍如何从零开始手动配置一个基于的工程。 开发一个 React 项目,通常避免不了要去配置 Webpack 和 babel 之类,以支持 commonjs 或 es 模块及各种 es 新语法,及进行 jsx 语法...

    Ethan815 评论0 收藏0
  • 最小白的webpack+react环境搭建

    摘要:接下来安装和,执行命令安装很顺利,没有遇到任何问题。再总结一下我们遇到的坑初始化时的项目名称要合规,特别是不能出现中划线下划线。另外再增加,这样刷新的速度会大大加快最终的文件目录结构为各文件的最终内容本文也同步发表在我的公众号“我的天空” 从零开始,用最少的配置、最少的代码、最少的依赖来搭建一个最简单的webpack+react环境。 最近在玩webpack+rea...

    番茄西红柿 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<