webpack构建多页面react项目(webpack+typescript+react)
目录介绍

src:里面的每个文件夹就是一个页面,页面开发相关的组件、图片和样式文件就存放在对应的文件夹下。
tpl:里面放置模板文件,当webpack打包时为html-webpack-plugin插件提供模板。
tsconfig.json:typescript的配置文件,需要自己新建并编写。
webpack.config.js:webpack的配置文件,需要自己新建并编写。
config:文件夹下的index.dev.js用来配置开发模块,index.js配置发布模块。将会在webpack.config.js中引用。index.dev.js是index.js的子集,index.js包含了所有的页面。
index.dev.js
module.exports = {
    page2: {
        title: "hello world!",
        tpl: "index"
      }
};
index.js
module.exports = {
    page1: {
      title: "hello world!",
      tpl: "index"
    },
    page2: {
      title: "hello world!",
      tpl: "index"
    }
  };
  
npm初始化项目
执行npm init命令,填写完基本信息后会生成一个package.json文件,"dependencies"属性是在安装依赖包附带--save参数时生成的,“devDependencies”属性是在安装开发依赖包附带--save-dev参数时生成的。
npm init
package.json文件
{
  "name": "react-demo",
  "version": "1.0.0",
  "description": "react+typescript+webpack项目",
  "private": true,  //设置为true,那么npm将拒绝发布它,防止私人存储库意外发布
  "scripts": {      // 自定义脚本,通过npm run执行脚本
    "start": "webpack-dev-server --mode development --cfg dev",  //启动web服务器,cfg是自定义参数,赋值为dev。
    "build": "webpack --mode production"
  },
  "keywords": [
    "react",
    "typescript",
    "webpack"
  ],
  "author": "chencong",
  "license": "ISC",
  "devDependencies": {
    "clean-webpack-plugin": "^1.0.1",
    "html-webpack-plugin": "^3.2.0",
    "ts-loader": "^5.3.3",
    "typescript": "^3.3.3",
    "webpack": "^4.29.3",
    "webpack-cli": "^3.2.3",
    "webpack-dev-server": "^3.1.14",
    "yargs": "^13.1.0"
  },
  "dependencies": {
    "react": "^16.8.2",
    "react-dom": "^16.8.2"
  }
}
添加react
npm install --save react react-dom
添加typescript
安装typescript编译器和loader
npm install --save-dev typescript ts-loader
安装完成后需要编写配置文件,在项目中新建tsconfig.json文件。配置完后就该ts-loader登场了,在webpack.config.js中配置loader,将项目中所有的用typescript语法编写的文件都用ts-loader处理,处理的依据就是tsconfig.json文件。还有一点需要提一下,项目可以不用babel进行转码了,因为ts-loader已经帮我们处理了,tsconfig.json中“target”: “es5”就是转码成es5的配置,"jsx": "react"就是对jsx的支持,不需要用babel-preset-react进行转码。(typescript配置文档)
{
  "version": "1.0.0",
  "compilerOptions": {
    "baseUrl": "./",  //解析非相对模块的基准目录
    "paths": {  //路径映射,如在文件中使用‘~/’相当于‘src/’
      "~/*": ["src/*"]
    },
    "module": "esnext",  //指定生成哪个模块系统的代码
    "target": "es5", //生成es5的js文件
    "jsx": "react",  //在tsx文件里支持jsx
    "sourceMap": true,
    "moduleResolution": "node", //决定如何处理模块
    "allowJs": true,  //允许编译js文件
    "strictNullChecks": false,  //在严格的 null检查模式下, null和 undefined值不包含在任何类型里,只允许用它们自己和 any来赋值(有个例外, undefined可以赋值到 void)
    "lib": ["es2015", "dom", "es2015.promise"]  //编译过程中需要引入的库文件的列表
  },
  "include": ["src/**/*"], //编译包含在  src及其子目录下的所有匹配的文件
  "exclude": ["dist", "node_modules"]  //编译时排除 dist、node_modules文件夹
}
添加webpack
执行以下命令添加webpack,使用webpack 4.X的命令行需要单独安装命令行工具,所以也要安装webpack-cli。html-webpack-plugin插件帮助我们在打包时根据模板生成html文件,还需注意模板中title标签的写法,应为<title><%= htmlWebpackPlugin.options.title%></title>。clean-webpack-plugin插件会在项目打包前删除指定的文件,通常用来删除旧的打包文件。yargs包提供了获取命令行中参数的对象。
npm install --save-dev webpack webpack-cli html-webpack-plugin clean-webpack-plugin yargs
接下来编写webpack的配置文件,在项目中新建配置文件webpack.config.js。(webpack文档)
const path = require("path");
const argv = require("yargs").argv;  //获取命令行中参数的对象
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CleanPlugin = require("clean-webpack-plugin");
const webpack = require("webpack");
const isDev = argv.cfg && argv.cfg === "dev";  //是否为开发模式,如果输入yarn start执行"webpack-dev-server --mode development --cfg dev",argv.cfg获取参数的值为dev。
let compileConfig = "index";
if (isDev) {
  compileConfig = "index." + argv.cfg;
}
const buildConfig = require(`./config/${compileConfig}`); // 开发模式下,引入index.dev.js中的配置信息。生产模式下,引入index.js中的配置信息
const modules = Object.keys(buildConfig);
const entry = Object.create(null);
const htmlPlugins = [];
if (modules.length > 0) {
  for (let srcModule of modules) {
    entry[srcModule] = path.resolve(__dirname, `./src/${srcModule}`);  // 多页面应用webpack配置文件entry属性的值
    htmlPlugins.push(  // html-webpack-plugin插件生成html的配置
      new HtmlWebpackPlugin({
        title: buildConfig[srcModule]["title"],
        filename: `${srcModule}/index.html`,
        template: path.resolve(__dirname, "./tpl/index.html"),
        chunks: [srcModule]
      })
    );
  }
}
const config = {
  entry,
  output: {
    publicPath: "/dist/",
    filename: "[name].[hash].js",
    path: path.resolve(__dirname, "dist")
  },
  module: {
   rules: [
    { // 除了node_modules文件夹中的文件,所有的tsx文件都用ts-loader处理
     test: /\.tsx?$/,
     use: "ts-loader",
     exclude: /node_modules/
    }
   ] 
  }
  plugins: [new CleanPlugin(['dist']), ...htmlPlugins],
  resolve: {
    extensions: [".tsx", ".ts", ".js"]
  },
  devtool: isDev ? "source-map" : false    // 值为source-map时,方便在浏览器中使用react开发工具调试
};
if (isDev) {  // 开发模式时,启动web服务
  config.devServer = {
  contentBase: './dist',  // 告诉服务器那个文件夹提供静态资源
    port: 9000,
    open: true,
    hot: false,  // 启用webpack中的热替换特性,这里我们不用热替换(不刷新整个页面的情况下更新部分更改)而用热更新(整个页面自动刷新)
    openPage: `dist/${modules[0]}`  // 打开index.dev.js配置中的第一个页面
  };
 // config.plugins.push(new webpack.HotModuleReplacementPlugin());  // 热替换需要的插件
}
module.exports = config;
关于样式
webpack在打包除javascript以外的静态资源时,需要用loader预处理。在实际开发中我通常用less来写样式,所以先要用less将less文件编译成css ,然后用css-loader预处理css文件。最后还需要用mini-css-extract-plugin插件将css从webpack打包后的文件中抽离出来按需加载,或者用style-loader将css以内联的方式加载,mini-css-extract-plugin插件和style-loader不能同时使用,推荐使用前者将样式抽离出来按需加载。
安装
npm install --save-dev css-loader less-loader less mini-css-extract-plugin
webpack.config.js中配置
  module: {
    rules: [
       ...
      {
        test: /\.less$/,
        use: [  // webpack会从右往左加载loader,所有书写loader时有顺序要求
       // {
    //  loader: 'style-loader'  //style-loader不能和mini-css-extract-plugin同时使用
    // }
          MiniCssExtractPlugin.loader,
          {
        loader: 'css-loader'
      },
          {
        loader: 'less-loader'
      }
        ]
      }
      ...
    ]
  },
  plugins: [
    ...
    new MiniCssExtractPlugin({
      filename: "[name].[hash].css",
      chunkFilename: "[name].[hash].css"
    }),
    ...
  ],    
autoprefixer
写样式时为了兼容不同的浏览器,css3的特性需要加前缀,例如:
-moz- 对应 Firefox,
-webkit- 对应 Safari and Chrome
-o- 对应 Opera
-ms- 对应 Internet Explorer
如果自己手动地写就会很麻烦,于是就有了autoprofixer帮我们自动添加这些前缀。postcss-flexbugs-fixe是用来修复一些flexbox的bug。
安装
cnpm install --save-dev postcss-loader autoprefixer postcss-flexbugs-fixes
webpack.config.js中配置
  module: {
    rules: [
       ...
      {
        test: /\.less$/,
        use: [
          // {
          //   loader: "style-loader"
          // },
          MiniCssExtractPlugin.loader,
          {
            loader: "css-loader"
          },
          {
            loader: "less-loader"
          },
          {
            loader: "postcss-loader",
            options: {
              ident: "postcss",  // postcss-loader中options里使用了function、require时需要ident属性,可以是任意值
              plugins: () => [
                require("postcss-flexbugs-fixes"),
                autoprefixer({
                  browsers: [
                    ">1%",
                    "last 4 versions",
                    "Firefox ESR",
                    "not ie < 9"
                  ],
                  flexbox: "no-2009"  // false将禁用flexbox属性前缀。或flexbox:“no-2009”将仅为最终版本和IE版本的规范添加前缀。
                })
              ]
            }
          },
        ]
      }
    ]
  },    
图片处理
页面引入图片如:background: url(,/images/logo.png) ,webpack打包时无法解析图片报错,这时就需要loader来处理图片。

ur-loader可以将图片转化成base64的格式,以减少请求次数。。
安装
npm i -D url-loader
webpack.config.js配置
module: {
  rules: [
    ...
    {
        test: /\.png|jpg|gif|jpeg|svg/,
        use: [
            {
                loader: 'url-loader',
                options: {
                    limit: 10000,   // 当图片小于limit(单位:byte)时图片转换成base64,大于limit时其表现行为等于file-loader
                  name: './images/[name].[hash:8].[ext]'   // 当图片大于limit时起作用 ,'./images'表示图片打包的路径相对于output.path,[name]表示图片的名称,[hash:8]表示9位数的hash值,[ext]表示保持原来的后缀名
         }
            }
        ]
    }
   ]  
}     
以上就是构建多页面应用的所有配置了,如有疑问或有更好的建议欢迎交流!
webpack构建多页面react项目(webpack+typescript+react)的更多相关文章
- gulp + webpack 构建多页面前端项目
		
修改增加了demo地址 gulp-webpack-demo 之前在使用gulp和webpack对项目进行构建的时候遇到了一些问题,最终算是搭建了一套比较完整的解决方案,接下来这篇文章以一个实际项目为例 ...
 - webpack 构建多页面应用
		
如何使用webpack构建多页面应用,这是一个我一直在想和解决的问题.网上也给出了很多的例子,很多想法.猛一看,觉得有那么点儿意思,但仔细看也就那样. 使用webpack这个构建工具,可以使我们少考虑 ...
 - 使用Webpack构建多页面程序
		
使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面程序. 原理 将每个页面所在的文件夹都看作是一个单独的单页面 ...
 - webpack构建原理和实现简单webpack
		
webpack打包原理分析 基础配置,webpack会读取配置 (找到入口模块) 如:读取webpack.config.js配置文件: const path = require("path& ...
 - webpack 构建简单的vue项目
		
---恢复内容开始--- webpack主要执行流程: 入口→loader处理→出口 // webpack.config.js 文件:const path = require('path') // 引 ...
 - 初始化一个React项目(TypeScript环境)
		
React将由三部分组成,其中,Redux是应用状态管理服务,React-Router用于路由映射,React View用于显示界面. 我们使用Facebook推荐的create-react-app来 ...
 - 使用webpack搭建react项目 webpack-react-project
		
webpack-react-project 使用webpack搭建react项目 webpack搭建react项目 github源码 具体配置信息参照package.json和webpack.conf ...
 - React项目中应用TypeScript
		
一.前言 单独的使用typescript 并不会导致学习成本很高,但是绝大部分前端开发者的项目都是依赖于框架的 例如和vue.react 这些框架结合使用的时候,会有一定的门槛 使用 TypeScri ...
 - React脚手架创建一个React应用以及项目目录结构详解
		
react脚手架 用来帮助程序员快速创建一个基于xxx库的模板项目,包含了所有需要的配置,指定好了所有的依赖,可以直接安装/编译/运行一个简单效果 react提供了一个专门用于创建react项目的脚手 ...
 
随机推荐
- linux系统软件版本升级
			
在安装完软件之后,在同一层目录生成一个符号链接,并把当前软件的目录映射到这个链接上,后面的操作都只通过这个链接去做,以后升级版本的时候,把最新的软件目录映射到这个链接上就可以了. 如我刚装的apach ...
 - SpringBoot集成freemarker和thymeleaf模板
			
1.在MAVEN工程POM.XML中引入依赖架包 <!-- 引入 freemarker 模板依赖 --> <dependency> <groupId>org.spr ...
 - Openssl ciphers命令
			
一.简介 ciphers指令是用来展示用于SSL加密算法的工具 二.语法 openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist] 选项 -v ...
 - rocketmq配置项说明(对应版本:4.0.0-incubating)
			
Broker配置参数说明 自定义客户端行为 ※一些默认配置的源代码路径 org.apache.rocketmq.store.config --END--
 - mysql:查询数据库版本的几种方式
			
Mysql版本: 登入数据库的时候: select @@version; select version(); mysql> select @@version; +-----------+ | @ ...
 - servlet介绍
			
1.首先说Servlet API:servlet的命名:server+applet Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http. 在 ...
 - Sql的行列转换
			
创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...
 - java软件托盘显示中文出现框框乱码
			
目录 文章背景 目录 问题的代码 解决办法 说明 参考文章 版本记录 文章背景 测试代码时候突然发现代码运行时候的托盘菜单的名字显示异常,查询了下资料发现是运行参数的缘故. 目录 问题的代码 系统是w ...
 - CVPR,ICCV和ECCV,计算机视觉三大顶级盛会
			
简介:https://blog.csdn.net/hualitlc/article/details/11099693 近几年ICCV,CVPR,和ECCV论文列表:https://www.xuebuy ...
 - Javascript 的addEventListener()及attachEvent()对比
			
Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...