首页 > 其他分享 >13.JS学习篇-ES6 React 项目模板

13.JS学习篇-ES6 React 项目模板

时间:2024-08-29 09:21:20浏览次数:13  
标签:ES6 13 const true app React webpack error config

1.项目能力支持

1.项目初始化脚手架

1.前端编码规范工程化(lint工具、Node CLI等)

2.用工具提升项目的编码规范,如:eslintstylelintcommitlintmarkdownlinthusky等

3.工具对于JavaScriptTypescriptReactVue等不同类型的前端项目下的标准的语法限制;

2.相关基础功能

• React : 前端页面展示框架; • Redux :状态管理; • React Router :前端路由; • Connected React Router :支持将 Redux 与 React Router 进行绑定; • Express 服务端; • TypeScript 类型检查; • Webpack 打包构建工具; • Babel : ES6+ 转 ES5 工具; • nodemon :监测 Node 应用变化时,自动重启服务器; • axios 基于 Promise 的 HTTP 客户端; • react-helmet :在客户端及服务端上管理标题、 meta 、样式和脚本标签; • loadable-component :支持组件的懒加载; • Webpack Dev Middleware :通过 Express 服务器提供 webpack 服务; • Webpack Hot Middleware :支持基于 Express 的热更新; • Webpack Bundle Analyzer :打包分析工具; • morgan :服务器日志; • terser-webpack-plugin :压缩 JS ; • css-minimizer-webpack-plugin :压缩 CSS ;

3.运行指令

使用cross-env提供跨平台的设置及环境变量:

## step1

====================================安装初始脚手架

命令行 start

sudo npm install -g encode-fe-lint

sudo encode-fe-lint init

React 项目 (TypeScript)

Y Y Y

====================================命令行 end

## step2

基础环境配置

- 查看 package.json 文件

"private"

"script"-"preinstall"/"prepare"/"init"

"engines"

"devDependencies"

"dependencies"

====================================命令行 start

sudo npm install -g pnpm

sudo pnpm install

====================================命令行 end

2.项目初始化配置

项目目录:

1. 新建 babel.config.js,以及内部配置

2. tsconfig 的配置, tsconfig.json

sudo npm install -g typescript

sudo tsc --init

3. 实现相关的 postcss,创建 postcss.config.js

4. webpack cross-env

我们需要客户端和服务端渲染,所以如下

webpack 目录

- base.config.ts

- client.config.ts

- server.config.ts

我们看到网上很多都是如下

- webpack.common.js

- webpack.dev.js

- webpack.prod.js

webpack 是纯用于打包的,和 js/ts 没有关系的

webpack5 中 MiniCssExtractPlugin,将 css 分离出

progressPlugin 编译进度包

webpack-manifest-plugin ssr 中需要引入的,页面中的基本信息

loadablePlugin 分包的方式引入子包的内容

DefinePlugin 定义全局变量

bundle-analyze plugin 分析线上的包

⭐️⭐️⭐️⭐️⭐️⭐️⭐️

通用的能力做抽离,根据不同的环境,进行不同的配置。

先打包构建,生产产物

nodemon.json,开发过程中,可以监听 public 下面文件的变化&&服务端的更新

到这一步为止,基础环境已经配置完成.不用脚手架,自己手写也可以,加油吧~

3.客户端配置

1.入口文件

// src/app/index.tsx
const App = ({ route }: Route): JSX.Element => (
    <div className={styles.App}>
        <Helmet {...config.APP} />
        <Link to="/" className={styles.header}>
            <img src={logo} alt="Logo" role="presentation" />
            <h1>    
                <em>{config.APP.title}</em>
            </h1> 
            </Link>
            <hr />
            {/* Child routes won't render without this */}
            {renderRoutes(route.routes)}
        </div>
};

// src/client/index.tsx
const render = (Routes: RouteConfig[]) =>
    ReactDOM.hydrate(
        <Provider store={store}>
            <ConnectedRouter {...props}>{renderRoutes(Routes)}</ConnectedRouter>
        </Provider>,
    document.getElementById('react-view'),
);


// loadable-component setup
loadableReady(() => render(routes as RouteConfig[]));

2.错误边界处理

import { ReactNode, PureComponent } from "react";

interface Props {
    children?: ReactNode;
}
interface State {
    error: Error | null;
    errorInfo: { componentStack: string } | null;
}
class ErrorBoundary extends PureComponent<Props, State> {
    constructor(props: Props) {
        super(props);
        this.state = { error: null, errorInfo: null };
    }
    componentDidCatch(error: Error, errorInfo: { componentStack: string }): void
        // Catch errors in any components below and re-render with error message
        this.setState({ error, errorInfo });
        // You can also log error messages to an error reporting service here
    }
    render(): ReactNode {
        const { children } = this.props;
        const { errorInfo, error } = this.state;
        // If there's an error, render error path
        return errorInfo ? (
            <div data-testid="error-view">
            <h2>Something went wrong.</h2>
            <details style={{ whiteSpace: "pre-wrap" }}>
            {error && error.toString()}
            <br />
            {errorInfo.componentStack}
            </details>
            </div>
        ) : (
            children || null
        );
    }
}
 export default ErrorBoundary;

3.页面入口配置

const Home: FC<Props> = (): JSX.Element => {
    const dispatch = useDispatch();
    const { readyStatus, items } = useSelector(
        ({ userList }: AppState) => userList,
        shallowEqual
    );
    // Fetch client-side data here
    useEffect(() => {
        dispatch(fetchUserListIfNeed());
    }, [dispatch]);
    const renderList = () => {
        if (!readyStatus || readyStatus === "invalid" || readyStatus === "request"
            return <p>Loading...</p>;
        if (readyStatus === "failure") return <p>Oops, Failed to load list!</p>;
            return <List items={items} />;
    };
    return (
        <div className={styles.Home}>
            <Helmet title="Home" />
            {renderList()}
        </div>
    );
};
// Fetch server-side data here
export const loadData = (): AppThunk[] => [
    fetchUserListIfNeed(),
    // More pre-fetched actions...
];
export default memo(Home);
1

4.路由配置

export default [
    {
        component: App,
        routes: [
            {
                path: "/",
                exact: true,
                component: AsyncHome, // Add your page here
                loadData: loadHomeData, // Add your pre-fetch method here
            },
            {
                path: "/UserInfo/:id",
                component: AsyncUserInfo,
                loadData: loadUserInfoData,
            },
            {
                component: NotFound,
            },
        ],
    },
] as RouteConfig[];

4.服务端配置

1.请求配置

// 使用https://jsonplaceholder.typicode.com提供的接口设置请求

export default {
    HOST: 'localhost',
    PORT: 3000,
    API_URL: 'https://jsonplaceholder.typicode.com',
    APP: {
        htmlAttributes: { lang: 'zh' },
        title: '萍宝贝 ES6 项目实战',
        titleTemplate: '萍宝贝 ES6 项目实战 - %s',
        meta: [
            {
                name: 'description',
                content: 'wikiHong ES6 React 项目模板',
            },
        ],
    },
};

2.入口文件

const app = express();

// Use helmet to secure Express with various HTTP headers
app.use(helmet({ contentSecurityPolicy: false }));

// Prevent HTTP parameter pollution
app.use(hpp());

// Compress all requests
app.use(compression());

// Use for http request debug (show errors only)
app.use(logger('dev', { skip: (_, res) => res.statusCode < 400 }));
app.use(favicon(path.resolve(process.cwd(), 'public/logo.png')));
app.use(express.static(path.resolve(process.cwd(), 'public')));

// Enable dev-server in development
if (__DEV__) devServer(app);

// Use React server-side rendering middleware
app.get('*', ssr);

// @ts-expect-error
app.listen(config.PORT, config.HOST, (error) => {
    if (error) console.error(chalk.red(`==> 

标签:ES6,13,const,true,app,React,webpack,error,config
From: https://blog.csdn.net/qq_34334992/article/details/141562309

相关文章

  • JavaScript 模块化开发:ES6 模块与 CommonJS 的对比与应用
    ​​您好,我是程序员小羊!前言随着前端项目规模的增长,代码组织和管理变得越来越复杂。模块化开发成为解决这一问题的有效手段,能够帮助开发者将代码进行分割、复用和维护。JavaScript在发展过程中出现了多种模块化规范,其中最为广泛使用的有ES6模块(也称为ESModules)......
  • 【高等代数笔记】(8-13)N阶行列式
    2.N阶行列式数域K\textbf{K}K上的二元方程组{......
  • 【Linux网络编程】Reactor模式与Proactor模式
    【Linux网络编程】Reactor模式与Proactor模式Reactor模式Reactor模式是指主线程即IO处理单元只负责监听文件描述符上是否有事件发生,有则立刻将该事件通知给工作线程即逻辑单元,除此之外,主线程不做任何其它实质性的动作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完......
  • 信息学奥赛一本通1314:【例3.6】过河卒(Noip2002)
    【题目描述】棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n,......
  • 信息学奥赛一本通1328:【例7.7】光荣的梦想
    【题目描述】Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平衡是个梦想。因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破。KB决定求助于......
  • 南沙区信奥赛CSP-J/S 陈老师解题:1350:【例4-11】最短网络(agrinet)
    ​ 【题目描述】农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。你将得到一......
  • 南沙信息学家教陈老师: 1349:【例4-10】最优布线问题
    ​【题目描述】学校有nn台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们......
  • 软件设计师全套备考系列文章13 -- 数据库:概念、三级模式两级映像、设计过程、数据模型
    软考--软件设计师(13)--数据库:概念、三级模式两级映像、设计过程、数据模型文章目录软考--软件设计师(13)--数据库:概念、三级模式两级映像、设计过程、数据模型前言一、章节考点二、基本概念三、三级模式、两级映像四、设计过程五、数据模型前言考试时间:每年5月、......
  • day13: 第六章 二叉树part01 |二叉树的前序遍历,后序遍历,中序遍历,(递归。层序(广度)跟
    二叉树递归三部曲:1.确定递归函数的参数和返回值。2.确定终止条件3.确定单层递归的逻辑144.二叉树的前序遍历:中左右,递归:classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>res=newArrayList<Integer>();p......
  • 实景三维数字沙盘技术标准【TB0822/T 0013—2023】
    1范围本文件立足当前技术的发展现状,描述了实景三维数字沙盘的定义、沙盘内容、沙盘功能、沙盘成果等技术参数要求,为数字沙盘的建设提供参考依据。适用于城乡规划、工程建设、指挥救援、环境应急、预案演练(消防、公安、武警)、安全生产、园区管理等领域。 2定义实景三维......