ECMA进阶1之从0~1搭建react同构体系项目1

ECMA进阶

  • ES6项目实战
    • 前期介绍
      • SSR
      • pnpm 包管理工具
      • package.json
    • 项目搭建
      • 初始化配置
      • 引入encode-fe-lint
    • 基础环境的配置
      • 修改package.json
      • babel相关
      • tsconfig相关
      • postcss相关
      • 补充scripts脚本
      • webpack配置
        • base.config.ts
        • client.config.ts
        • server.config.ts
    • src环境
      • server端:
      • client端
      • 路由
      • Home
    • 构建过程
    • SSR的好处

ES6项目实战

前期介绍

SSR

当页面首次加载时候,spa只会返回空节点,内容都是空的,而ssr会将页面的骨架,内容等提前加载出来,提高效率。
spa首屏加载很慢。

SSR:利于首屏加载
CSR:(spa)不利于首屏加载,页面结构为空节点

本次项目可以执行在浏览器,也可以执行在客户端中

pnpm 包管理工具

  1. 构建速度快
  2. 支持 monorepo
  3. 高效率利用磁盘空间
  4. 安全性比较高

package.json

  1. build:run-s => npm-run-all 执行多个npm脚本(可并行、串行)
    build:server
    build:client
    以上两个并行执行
  2. “preinstall”: “npx only-allow pnpm” 对安装包有限制,只能使用pnpm
  3. 包的分析,借助analyze插件分析包依赖的大小,可优化包的体积

在这里插入图片描述

项目搭建

初始化配置

npm init

在这里插入图片描述

引入encode-fe-lint

npm install encode-fe-lint -gencode-fe-lint -g

encode-fe-lint init

在这里插入图片描述

选择 React项目(TypeScript),只需要prettierrc
请添加图片描述

encode-fe-lint-scan:对代码进行扫描
encode-fe-lint-fix:对当前代码进行修复

pre-commit:触发代码扫描
commit-msg:触发扫描

package.json:
请添加图片描述

基础环境的配置

  1. 修改package.json
  2. react-> 使用 babel 通过babel插件 babel.config.js或者 .babelrcjsxtsx代码转译
  3. tsconfig相关的配置
  4. postcss 给css能力增强
  5. webpack配置(client端、server端):用的cross-env

修改package.json

  • 全局:
    • 去掉version -> private:“true”
    • 去掉 main
  • scripts脚本:
    • 去掉 test
    • 增加
      “preinstall”: “npx only-allow pnpm”,
      “prepare”: “husky install”,
      “init”:“pnpm install”,
  • engines
    • “node”: “>=12”,
      “npm”:“>=6”
  • 引入依赖devDependencies,dependencies

引入好后执行命令安装:

pnpm run init

如果报关于husky的错,执行下面代码再重新安装

git init

{
  "name": "es6-demo",
  "private": "true",
  "description": "",
  "scripts": {
    "preinstall": "npx only-allow pnpm",
    "prepare": "husky install",
    "init":"pnpm install",
    "encode-fe-lint-scan": "encode-fe-lint scan",
    "encode-fe-lint-fix": "encode-fe-lint fix"
  },
  "engines": {
    "node": ">=12",
    "npm":">=6"
  },
"devDependencies": {
   ...
  },
  "dependencies": {
  	...
  },
  "author": "echo",
  "license": "ISC",
  "husky": {
    "hooks": {
      "pre-commit": "encode-fe-lint commit-file-scan",
      "commit-msg": "encode-fe-lint commit-msg-scan"
    }
  }
}

babel相关

  • 创建babel.config.js文件
    请添加图片描述
module.exports = (api) => {
  const isWeb = api.caller((caller) => caller && caller.target === "isWeb");

  return {
    presets: [
      [
        "@babel/env",  //解决高版本语法但是低版本不能兼容的问题
      ],
      "@babel/typescript",
      [
        "@babel/react",
        {
          runtime: "automatic",  //对jsx解析有两个版本:1.传统的React.createElement 将jsx转为虚拟dom
          // 2.classic
        },
      ],
    ],
    //预设  [react相关的预设]           //插件是对一些api的实现,例如不支持async/await的浏览器将他们的实现提前加载进来
    plugins: ["@loadable/babel-plugin", "@babel/plugin-transform-runtime"],
    env: {
      development: {  // react-refresh
        plugins: isWeb ? ["react-refresh/babel"] : undefined,
      },
    },
  };
};

tsconfig相关

tsc -init

请添加图片描述

{
  "compilerOptions": {
    "sourceMap": true,
    "target": "es5",  //目标环境 es5
    "module": "commonjs",
    "lib": ["dom", "dom.iterable", "esnext"],
    "jsx": "react-jsx",
    // Specify module resolution strategy: "node" (Node.js) or "classic" (TypeScript pre-1.6)
    "moduleResolution": "node",
    // Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports.
    // Implies "allowSyntheticDefaultImports". Recommended by TS
    "esModuleInterop": true,
    // Skip type checking of declaration files. Recommended by TS
    "skipLibCheck": true,
    // Disallow inconsistently-cased references to the same file. Recommended by TS
    "forceConsistentCasingInFileNames": true,
    // Do not emit outputs
    "noEmit": true,
    // Raise error on expressions and declarations with an implied "any" type
    "noImplicitAny": false,
    // Report errors on unused locals
    "noUnusedLocals": true,
    // Report errors on unused parameters
    "noUnusedParameters": true,
    // Report error when not all code paths in function return a value
    "noImplicitReturns": true,
    // Report errors for fallthrough cases in switch statement
    "noFallthroughCasesInSwitch": true
  }
}

postcss相关

创建postcss.config.js文件
请添加图片描述

module.exports={
  plugins:[require('autoprefixer')]
}

package.json:

"browerslist":[
    ">1%",
    "last 2 versions"
  ],

请添加图片描述

适配以下浏览器:
请添加图片描述

补充scripts脚本

请添加图片描述

webpack配置

建立webpack目录
请添加图片描述

base.config.ts

在这里插入图片描述

client.config.ts

在这里插入图片描述

server.config.ts

在这里插入图片描述

src环境

在这里插入图片描述

server端:

使用express启动一个服务,再返回一个html回去
将数据放到window上

client端

  1. 从window上获取数据__INITIAL_STATE__。避免client再加载首屏数据
  2. createStore用到redux/toolkit,它是state和router的集合
  3. 渲染客户端入口 到 react-view上

路由

  1. 使用Helmet,因为支持client和server

Home

使用ErrorBoundary使得代码变得健壮性

构建过程

  1. 选择什么生态(Vue、React)
    React
  2. 依赖
    react react-dom react-router redux
  3. 构建工具的选择
    webpack、rollup、vite
  4. webpack、plugins、loaders
  5. 开始构建

SSR的好处

  1. 利于seo
  2. 利于首屏渲染
  3. server输出html,client加载 js 补全事件,两者结合才能实现快速渲染,正常交互

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547327.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表--经典题

题目一:移除链表元素 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入:head [], val 1 输出:[]示例 3: 输入:head [7,7,7,7], val 7 输出…

【转】关于vsCode创建后,不显示NPM脚本解决

刚刚使用vue ui新建了个vue项目,打开vs-code发现,无论怎么设置都找不到NPM脚本显示,苦恼了很久,突然发现!打开了package-lock.json,然后立马把vs-code关闭,重新打开,就显示了npm脚本…

计算机网络(三)数据链路层

数据链路层 基本概念 数据链路层功能: 在物理层提供服务的基础上向网络层提供服务,主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改在为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的…

03-echarts如何画立体柱状图

echarts如何画立体柱状图 一、创建盒子1、创建盒子2、初始化盒子(先绘制一个基本的二维柱状图的样式)1、创建一个初始化图表的方法2、在mounted中调用这个方法3、在方法中写options和绘制图形 二、画图前知识1、坐标2、柱状图图解分析 三、构建方法1、创…

构建高效协同平台架构:实现团队协作的新高度

随着企业规模的扩大和工作方式的变革,团队协作变得愈发重要。在这个数字化时代,构建一个高效的协同平台架构,能够为团队提供强大的工具和资源,实现更加高效、灵活的协作方式。本文将探讨协同平台架构的重要性,并介绍如…

UE5不打包启用像素流 ubuntu22.04

首先查找引擎中像素流的位置: zkzk-ubuntu2023:/media/zk/Data/Linux_Unreal_Engine_5.3.2$ sudo find ./ -name get_ps_servers.sh [sudo] zk 的密码: ./Engine/Plugins/Media/PixelStreaming/Resources/WebServers/get_ps_servers.sh然后在指定路径中…

笔试的解题思路很多,

昨天发的笔试题目,留言的人还挺多,这道笔试题目是字节的嵌入式笔试题目,从面试的朋友描述说,对方的面试过程很专业。 现场写代码, 金三银四一直是铁律,去年我一个朋友离职后,也是最近这几天拿到…

【C语言】预处理

个人主页点这里~ 预处理 一、预处理符号二、#define定义常量三、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏与函数的对比(一)、宏的优势(二)、宏的劣势(三)、宏和函数的对比 七、#和##1、…

Emacs之增加/取消输入括号自动匹配(一百三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

vue webpack打包配置生成的源映射文件不包含源代码内容、加密混淆压缩

前言:此案例使用的是vue-cli5 一、webpack源码泄露造成的安全问题 我们在打包后部署到服务器上时,能直接在webpack文件下看到我们项目源码,代码检测出来是不安全的。如下两种配置解决方案: 1、直接在项目的vue.config.js文件中加…

C语言 | Leetcode C语言题解之第30题串联所有单词的子串

题目: 题解: typedef struct {char key[32];int val;UT_hash_handle hh; } HashItem;int* findSubstring(char * s, char ** words, int wordsSize, int* returnSize){ int m wordsSize, n strlen(words[0]), ls strlen(s);int *res (int *)mall…

【测试开发学习历程】python常用的模块(中)

目录 5 time模块 5.1、Python中的四种格式的时间: 5.2、time模块中的常用函数 6 I/O流操作 6.1 创建文件 6.2 读取一个文件存入到另外一个文件 6.3 with open as 结构 6.4 open和with open as的区别 7 Excel的操作模块-openpyxl 7.1、新建Excel文件进行读…

11.范式与反范式设计

范式 1.问题 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多…

bestvike 资料 --Spring Boot 2.5.0

Spring Boot 2.5.0 SSM环境搭建 springspringmvcmybatisspring springmvc mybatis # 项目 - 需求分析 概要设计(库表设计) 详细设计(验证库表正确性) 编码(环境搭建业务代码) 测试 部署上线# 员工添加 查询所有功能 SSM - 库表 库: ssm 数据库:mysql 表: id na…

spring-cloud微服务gateway

核心部分:routes(路由), predicates(断言),filters(过滤器) id:可以理解为是这组配置的一个id值,请保证他的唯一的,可以设置为和服务名一致 uri:可以理解为是通过条件匹配之后需要路由到&…

RabbbitMQ基本使用及其五种工作模型

初识MQ 同步通讯和异步通讯 什么是同步通讯呢?举个例子,你认识了一个小姐姐,聊的很火热,于是你们慢慢开始打电话,视频聊天,这种方式就成为同步通讯,那什么是一部通讯呢,同样的&…

gitlab(docker)安装及使用

GitLab GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。 下载(docker) 查询docker镜像gitlab-ce gitlab-ce是它的社区版 [rootlocalhost ~]# docker search gitlab-ce NAME …

OpenCV基本图像处理操作(六)——直方图与模版匹配

直方图 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的…

SETR——Rethinking系列工作,展示使用纯transformer在语义分割任务上是可行的,但需要很强的训练技巧

题目:Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers 作者: 开源:https://fudan-zvg.github.io/SETR 1.研究背景 1.1 为什么要研究这个问题? 自[ 36 ]的开创性工作以来,现有的语义分割模型主要是**基于全卷积网络( FCN )的…

ubuntu20.04安装+ros-noetic安装+内网穿透frp

刷机后的系统安装 ubuntu20.04安装安装ros-noetic安装各种必要的插件安装vscode内网穿透连接实验室主机配置frpc和frps文件运行完成自动化部署免密登录linux的免密登录windows上的免密登录 内网穿透的参考链接:如何优雅地访问远程主机?SSH与frp内网穿透配…