在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
平时进行开发大多数是基于vue-cli或者create-react-app等官方或者公司内部搭建的脚手架。
我们业务仔做的最多就是npm i和npm run dev或者npm start,然后在router文件夹上添加路由,在views或者pages文件夹中添加业务页面。这种快速开发对公司当然是好事,但对于开发人员来说对项目里的webpack封装和配置了解的不清楚,出
问题时很容易会不知如何解决,或者不会通过webpack去扩展新功能和优化编译速度。出去是没多大竞争力的,而且很容易被替代。
接下来一步一步的演示如何搭建基于TypeScript与React的一个开发环境。
项目代码:https://github.com/zhangwinwin/ts-react-starter (会不定时更新)
1. 搭建webpack的基础环境
webpack是一个开源的JavaScript模块打包工具,其核心是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件(有时会有多个)。这个过程就叫作模块打包。
Webpack就好比一个模块处理工厂,我们把源代码交给Webpack,由它进行加工、拼装处理,产出最终的资源文件,等待送往客户。
1.1、项目初始化运行npm init会生成一个package.json文件,里面包含一些项目的基本信息
npm init 1.2、安装webpack4webpack4将命令行相关的单独拆了出去封装成了webpack-cli。所以得安装webpack与webpack-cli
npm install webpack webpack-cli -D ps:在开始之前,请确保安装了Node.js的最新版本。
1.3、小试牛刀webpack4号称零配置。它提供mode配置选项(详情请看文档),告知webpack使用相应模式的内置优化。
用法如下:
// 在webpack配置文件中使用 module.exports = { mode: 'production' }; // 在命令行中使用 webpack --mode=production
console.log('hello, world')
"scripts": { "dev": "webpack ./src/main.js --mode development" }, 运行 npm run dev。如果出现dist/main.js说明运行成功。
2. 配置功能
"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.config.js
module.exports = { presets: [ [ '@babel/env', { useBuiltIns: 'usage', corejs: 3 } ] ] }; 修改webpack配置
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
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、配置HtmlWebpackPluginHtmlWebpackPlugin简化了HTML文件的创建,以便为你的webpack包提供服务。这对于在文件名中包含每次会随着编译而发生变化哈希的webpack bundle尤其有用。
npm i html-webpack-plugin -D
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' }), ] }
<!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 ></div> </body> </html> 2.4、配置 devServer 热更新功能webpack-dev-server能够用于快速开发应用程序,可以实现不刷新页面的情况下,更新我们的页面。
npm i webpack-dev-server -D
module.exports = { entry: ..., output: {...}, module: {...}, plugins: [...], devServer: { contentBase: path.resolve(__dirname, buildPath), compress: true, port: 9000 } }
"scripts": { "dev": "webpack-dev-server --open" }, 3、配置react
npm i react react-dom react-router-dom -S npm i @babel/preset-react -D
module.exports = { presets: [ ..., '@babel/preset-react' ] }; 3.1、小试牛刀
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 );
4、配置TypeScript
社区已经记录了90%的顶级JavaScript库。这意味着,你可以非常高效地使用这些库,而无需在单独的窗口打开相应文档。可以通过npm来安装使用@types
npm i @types/react @types/react-dom @types/react-router-dom typescript @babel/preset-typescript -D
module.exports = { presets: [ ..., '@babel/preset-typescript' ] }; { "compilerOptions": { "target": "ES2016", "module": "commonjs", "jsx": "react", "strict": true, "allowSyntheticDefaultImports": true, "esModuleInterop": true, "inlineSourceMap": true }, "include": [ "src" ] }
5、优化webpack5.1、mini-css-extract-plugin将css独立拆包最大的好处就是js和css的改动,不会影响对方。比如我改了js文件并不会导致css文件的缓存失效。
使用方式也很简单,大家看着文档抄就可以了。
npm i mini-css-extract-plugin -D 修改webpack.config.js
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打包css之后还需要做css代码压缩,这时候需要使用optimize-css-assets-webpack-plugin这个插件,它不仅能压缩css还能优化代码。
npm i cssnano optimize-css-assets-webpack-plugin -D 修改webpack.config.js
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 }) ], } 优化webpack就介绍到这里,掘金已有很多非常好的优化文章,请自行搜索并实践。
总结到目前为止,已经成功的自己搭建了一个typescript+react的开发环境。在搭建过程中,还是会踩很多坑的。
世上无难事,只怕有心人。动手试一试,比看半天都要好。
|
请发表评论