从零搭建TypeScript与React开发环境
前言
1. 搭建webpack的基础环境
1.1、项目初始化
npm init
1.2、安装webpack4
npm install webpack webpack-cli -D
1.3、小试牛刀
// 在webpack配置文件中使用
module.exports = {
mode: 'production'
}; // 在命令行中使用
webpack --mode=production
- 创建src/main.js
console.log('hello, world')
- 在package.json中配置命令
"scripts": {
"dev": "webpack ./src/main.js --mode development"
},
2. 配置功能
- 在根目录创建一个webpack.config.js

- 修改package.json
"scripts": {
"dev": "webpack --config webpack.config.js --mode development"
},
2.1、配置babel 安装依赖
npm install babel-loader @babel/core @babel/cli @babel/preset-env -D
npm install core-js regenerator-runtime -S
- Babel的核心功能包含在 @babel/core 模块中。
- babel提供的命令行工具@babel/cli,主要是提供babel这个命令。
- @babel/preset-env 主要作用是对我们所使用的并且目标浏览器中缺失的功能进行代码转换和加载 polyfill。在不进行任何配置的情况下,它所包含的插件将支持所有最新的JS特性(ES2015,ES2016等,不包含 stage 阶段),将其转换成ES5代码。
- core-js和regenerator-runtime可以模拟完整的ES2015+环境。这意味着可以使用诸如Promise和Map之类的新的内置组件、Array.from之类的静态方法、Array.prototype.includes之类的实例方法。
- @babel/preset-env提供了一个useBuiltIns参数,设置值为usage时,就只会包含代码需要的polyfill。有一点需要注意:配置此参数的值为usage,必须要同时设置corejs。
module.exports = {
presets: [
[
'@babel/env',
{
useBuiltIns: 'usage',
corejs: 3
}
]
]
};
module.exports = {
entry: ...,
output: ...,
module: {
rule: [
{
test: /\.(js|ts)x?$/, //jsx或者tsx文件
exclude: /(node_modules)/, // 排除node_modules
use: {
loader: 'babel-loader'
}
}
]
}
}
2.2、配置预处理器
npm install sass-loader dart-sass css-loader style-loader file-loader -D
- 修改webpack配置
module.exports = {
entry: ...,
output: ...,
module: {
rule: [
...,
{
test: /\.(c|sc|sa)ss$/,
use: [
'style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
implementation: require('dart-sass')
}
}
]
},
{
test: /\.(png|jpg|gif|woff|svg|ttf)$/,
use: [
'file-loader'
]
}
]
}
}
2.3、配置HtmlWebpackPlugin
npm i html-webpack-plugin -D
- 修改webpack配置
const HtmlWebpackPlugin = require('html-webpack-plugin');
...
module.exports = {
entry: ...,
output: {...},
module: {...},
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, 'public/index.html'),
title: 'ts-react-starter',
filename: 'index.html'
}),
]
}
- 创建public/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><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
2.4、配置 devServer 热更新功能
npm i webpack-dev-server -D
- 修改webpack配置
module.exports = {
entry: ...,
output: {...},
module: {...},
plugins: [...],
devServer: {
contentBase: path.resolve(__dirname, buildPath),
compress: true,
port: 9000
}
}
- 修改package.json
"scripts": {
"dev": "webpack-dev-server --open"
},
- 安装依赖
npm i react react-dom react-router-dom -S
npm i @babel/preset-react -D
- 修改babel.config.js
module.exports = {
presets: [
...,
'@babel/preset-react'
]
};
- 创建src/index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import {
BrowserRouter as Router,
Route
} from "react-router-dom"; import 'core-js/stable';
import 'regenerator-runtime/runtime'; const Root = document.getElementById('root'); const Test = () => <div className="test">test</div>; ReactDOM.render(
<Router>
<Route path='/' component={Test}>
</Route>
</Router>,
Root
);
- 修改webpack.config.js中的entry为src/index.jsx。
- 运行npm run dev即可看到效果。
npm i @types/react @types/react-dom @types/react-router-dom typescript @babel/preset-typescript -D
- 修改babel.config.js
module.exports = {
presets: [
...,
'@babel/preset-typescript'
]
};
{
"compilerOptions": {
"target": "ES2016",
"module": "commonjs",
"jsx": "react",
"strict": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"inlineSourceMap": true
},
"include": [
"src"
]
}
- 将.jsx文件改为tsx文件。
- 重新运行npm run dev即可看到效果。
5、优化webpack
5.1、mini-css-extract-plugin
npm i mini-css-extract-plugin -D
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
module: {
rules: [
...
{
test: /\.(c|sc|sa)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: process.env.NODE_ENV === 'development'
}
},
...
]
},
]
},
plugins: [
...
new MiniCssExtractPlugin({
filename: 'index.css'
}),
],
}
5.2、optimize-css-assets-webpack-plugin
npm i cssnano optimize-css-assets-webpack-plugin -D
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = {
plugins: [
...
new OptimizeCSSAssetsPlugin({
assetNameRegExp: /index\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', { discardComments: { removeAll: true } }]
},
canPrint: true
})
],
}
总结
作者:zhangwinwin来源: github
从零搭建TypeScript与React开发环境的更多相关文章
- 搭建 webpack、react 开发环境(三)
配置 react-router-dom 我们开发一个 React 工程肯定不是一两个“页面”就可以满足需求的,所以我们需要一个在多个“页面”中跳转的功能,在使用 React 构建的单页面应用中,要 ...
- 搭建 webpack、react 开发环境(二)
配置处理样式文件 到目前为止,整个工程的配置已经差不多了,对于 React 更多相关的配置将在后面继续介绍,现在我们先来对目前的工程进行优化. 前面我们学习了搭建 webpack.react 开发 ...
- 搭建 webpack、react 开发环境(一)
基本介绍 Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,它可以将多种静态资源 JavaScript.css.le ...
- 从零搭建和配置OSX开发环境
对于每一名开发者来说,更换系统或者更换电脑的时候,都免不了花上不短的时间去折腾开 发环境的问题.我本人也是三番两次,深知这个过程的繁琐.所有,根据我自己以往的经验, 以及参考一下他人的意见,整理一下关 ...
- 搭建公司的React开发环境
记录公司环境搭建 1.安装VSCODE, 安装网上的推荐各种控件2.安装node, yarn, 会自动添加path3.先初始化npm 全部按回车默认. npm init. 初始化yarn: yarn ...
- Webpack笔记(二)——搭建React开发环境
前几天一直在学习webpack,总算比之前学习的时候有了点收获,所以在昨天发布了一篇webpack入门笔记,今天继续使用webpack练了练手,搭建了一个React开发环境,如果还不熟悉的童鞋可以看一 ...
- TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建
1.TypeScript完全解读-开发环境搭建 初始化项目 手动创建文件夹 D:\MyDemos\tsDemo\client-demo 用VSCode打开 npm init:初始化项目 然后我们的项目 ...
- react学习笔记(一)用create-react-app构建 React 开发环境
React 可以高效.灵活的用来构建用户界面框架,react利用高效的算法最小化重绘DOM. create-react-app 是来自于 Facebook,通过该命令不需配置就能快速构建 React ...
- Mac中搭建 iOS 的 React Native 环境
手把手教你在Mac中搭建iOS的 React Native环境 http://www.cnblogs.com/damnbird/p/6074607.html 准备工作 1.你需要一台Mac电脑..(这 ...
随机推荐
- 返回前端页面的属性名称和实体类的名称不一致用@JsonProperty
场景:比如前端要求你返回一个json数据类型,但是这个json类型的里面属性有的值重复了,比如 { name:zhangsan, age:12, teacher:[ name:Mrs Liu subj ...
- [leetcode]66Plus One
/** * Given a non-negative integer represented as a non-empty array of digits, plus one to the integ ...
- SpringBoot 2.X以上集成redis
在网上看到的教程和资料大多数都是2.X以下的版本.使用起来会出现各种问题,通过百度,最后终于弄好了. 2.x以上使用的是 spring-boot-starter-data-redis 2.x一下使用的 ...
- Kali实现靶机远程控制
任务一.使用netcat建立监听并连接 1. 在ubuntu开启本地监听,在kali中连接 2. 在kali中开启监听,在ubuntu中反弹连接 任务二.使用met ...
- 远程控制卡 使用ipmitools设置ipmi
远程控制卡 使用ipmitools设置ipmi 使用DELL的远程控制卡可以方便的管理服务器 在CentOS中可以使用ipmitools管理 IPMI( Intelligent Platform Ma ...
- OpenManipulator RM-X52 ROS 开源机械臂
DYNAMIXEL PRO PH54-200-S500-R 简介
- (转) MySQL常用Json函数
原文:http://www.cnblogs.com/waterystone/p/5626098.html 官方文档:JSON Functions Name Description JSON_APPEN ...
- 如何在面试中介绍自己的项目经验(面向java改进版)
本人于3年前写的博文,如何在面试中介绍自己的项目经验,经过大家的捧场,陆续得到了将近7万个点击量,也得到了众多网站公众号的转载,不过自己感觉,这篇文章更多的是偏重于方法,没有具体给到Java方面相关的 ...
- WPF时间长度自定义选择控件TimeSpanBox
以下控件采用https://www.cnblogs.com/cssmystyle/archive/2011/01/17/1937361.html部分代码 以下控件采用https://www.cnblo ...
- Vue 组件内滚动条 滚到到底部
因为在vue中,某个组件内 使用scrollTop赋值 滚动条没有变化 使用scrollTo 也不行(window.scorllTo 或者dom.scrollTo) 所以可以考虑使用投机取巧的办法: ...