亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

React+TypeScript+webpack4多入口配置詳解

2024-05-06 16:54:07
字體:
來源:轉載
供稿:網友

資源

  • React-16.8.*
  • react-router-dom-4.3.*
  • TypeScript-3.5.*
  • webpack-4.*
  • eslint-5.16.*

項目目錄

├── dist # 打包結果目錄│  ├── demo1 //類別demo1的打包結果│  │  ├── demo1.himl│  │  ├── demo1.js│  │  └── demo1.css│  └── demo2 ... //類別demo2的打包結果├── src # 業務資源文件目錄│  ├── category //項目分類│  │  ├── demo1│  │  ├── demo2│  │  └── ...│  ├── components //公共組件│  ├── util //公共資源│  └── custom.d.ts //項目全局變量聲明文件├── index.html //項目啟動入口├── .gitignore //git忽略文件├── .eslintrc.js //eslint校驗配置├── package.json //依賴包├── tsconfig.json //ts配置├── webpack.config.build.js //webpack打包├── webpack.config.base.js //webpack基礎配置└── webpack.config.js //項目啟動配置

前言

對于復雜或多人開發的 React 項目來說,管理和使用每個組件的 props 、 state 或許會成為一件讓人頭痛的事情,而為每一個組件寫文檔,成本也會比較大,對項目的開發效率也不是最理想的。

Typescript 給 React 帶來很多好處:

  • 在組件頭部定義 interface,讓每個人在拿到組件的第一時間就可以很明確知道該組件需要使用的 props 和 state;
  • 在編譯中發現問題,減少運行時的報錯;
  • 可以在編輯器中實現實時類型校驗、引用查詢;
  • 約束類型,在混合多語言環境中降低風險,等。

需求

要搭建一個React+TypeScript+webpack的項目的話,一般都是團隊開發多人多文件項目,在搭建之前需要優先考慮以下幾個方面:

  • 開發體驗
  • 項目打包
  • 團隊規范

安裝

前置安裝

首先需要全局安裝typescript,這里默認大家都已經安裝了node以及npm

npm install -g typescript

首先新建文件夾并進入

mkdir tsDemo && cd tsDemo

然后進行初始化,生成package.json和tsconfig.json

npm init -y && tsc --init

安裝開發工具

npm install-D webpack webpack-cli webpack-dev-server

安裝react相關 

因為需要整合ts,而react原本的包是不包含驗證包的,所以這里也需要安裝相關ts驗證包

npm install -S react react-domnpm install -D @types/react @types/react-dom

安裝ts-loader

npm install -D ts-loader

以上是基本的 后續會貼出項目demo里面包含所有依賴包

webpack配置

添加webpack文件

根目錄下新建webpack.config.base.js、webpack.config.build.js、webpack.config.js文件

touch webpack.config.base.js webpack.config.build.js webpack.config.js
  • entry:入口文件(你要打包,就告訴我打包哪些)
  • output:出口文件(我打包完了,給你放到哪里)
  • resolve: 尋找模塊所對應的文件
  • module:模塊(放lorder,編譯瀏覽器不認識的東西)
  • plugins:插件(輔助開發,提高開發效率)
  • externals:打包忽略
  • devServer:服務器(webpack提供的本地服務器)
  • mode:模式,分為開發模式、生產模式。此為4.X里新增的

配置entry入口文件

因為大部分項目是多入口,多類別的,所有入口配置時不要配置單一入口

const fs = require("fs");const path = require("path");const optimist = require("optimist");const cateName = optimist.argv.cate;let entryObj = {};const srcPath = `${__dirname}/src`;//獲取當前項目要啟動或者打包的基礎路徑const entryPath = `${srcPath}/category/`;//未指定類別 啟動或者打包所有類別//如:npm run dev 或者npm run buildif (cateName == true) {  fs.readdirSync(entryPath).forEach((cateName, index) => {    // cateName/cateName指定輸出路徑為entryname    if (cateName != "index.html" && cateName != ".DS_Store") entryObj[`${cateName}/${cateName}`] = `${entryPath + cateName}/${cateName}.tsx`;  });} else if (cateName.indexOf(",")) {  // 一次指定多個類別 類別之間以","分割  //如:npm run dev erhsouche,huoche   let cateNameArray = cateName.split(",");  for (let i = 0; i < cateNameArray.length; i++) {    entryObj[`${cateNameArray[i]}/${cateNameArray[i]}`] = `${entryPath + cateNameArray[i]}/${      cateNameArray[i]    }.tsx`;  }} else {  // 打包單個入口文件  //如:npm run dev ershouche  entryObj[`${cateName}/${cateName}`] = `${entryPath + cateName}/${cateName}.tsx`;}const webpackConfig = {  entry: entryObj,}module.exports = {  webpackConfig,  entryObj};

配置output出口文件

const webpackConfig = {  output: {    //輸出文件名稱以當前傳入的cate類別名稱命名    filename: "[name].js",     //輸出到根目錄下的dist目錄中    path: path.resolve(__dirname, "dist"),    publicPath: "/",  },}

配置resolve

需要import xxx from 'xxx'這樣的文件的話需要在webpack中的resolve項中配置extensions,這樣以后引入文件就不需要帶擴展名

const webpackConfig = {  resolve: {    extensions: [".tsx", ".ts", ".js", ".jsx", ".json"],    //配置項通過別名來把原導入路徑映射成一個新的導入路徑。    alias: {      images: path.join(__dirname, "src/util/img")    },    // 使用絕對路徑指明第三方模塊存放的位置,以減少搜索步驟    modules: [path.resolve(__dirname, "node_modules")]   },}

配置module

概念

在webpack中任何一個東西都稱為模塊,js就不用說了。一個css文件,一張圖片、一個less文件都是一個模塊,都能用導入模塊的語法(commonjs的require,ES6的import)導入進來。webpack自身只能讀懂js類型的文件,其它的都不認識。但是webpack卻能編譯打包其它類型的文件,像ES6、JSX、less、typeScript等,甚至css、images也是Ok的,而想要編譯打包這些文件就需要借助loader

loader就像是一個翻譯員,瀏覽器不是不認識這些東西么?那好交給loader來辦,它能把這些東西都翻譯成瀏覽器認識的語言。loader描述了webpack如何處理非js模塊,而這些模塊想要打包loader必不可少,所以它在webpack里顯得異常重要。loader跟插件一樣都是模塊,想要用它需要先安裝它,使用的時候把它放在module.rules參數里,rules翻譯過來的意思就是規則,所以也可以認為loader就是一個用來處理不同文件的規則

所需loader

ts-loader

編譯TypeScript文件

npm install ts-loader -D

url-loader

處理css中的圖片資源時,我們常用的兩種loader是file-loader或者url-loader,兩者的主要差異在于。url-loader可以設置圖片大小限制,當圖片超過限制時,其表現行為等同于file-loader,而當圖片不超過限制時,則會將圖片以base64的形式打包進css文件,以減少請求次數。

npm install url-loader -D

css處理所需loader
css-loader 處理css
sass-loader 編譯處理scss
sass-resources-loader 全局注冊變量

html-loader 
處理.html文件

module完整配置

const webpackConfig = {  module: {    rules: [      //處理tsx文件      { test: //.(tsx|ts)?$/, use: ["ts-loader"], include: path.resolve(__dirname, "src") },      //處理圖片資源      {        test: //.(png|jpe?g|jpg|gif|woff|eot|ttf|svg)/,        use: [          // 對非文本文件采用file-loader加載          {            loader: "url-loader",            options: {              limit: 1024 * 30, // 30KB以下的文件              name: "images/[name].[hash:8].[ext]",            }          }        ],      },      //處理css和scss      {        test: //.(css|scss)$/,        use: [          //css單獨打包          MiniCssExtractPlugin.loader,          {            loader: "css-loader"          },          {            loader: "postcss-loader",            options: {              plugins: () => [require("autoprefixer")],              sourceMap: true            }          },          {            loader: "sass-loader",            options: {              sourceMap: true            }          },          {            loader: "sass-resources-loader",            options: {              resources: ["./skin/mixin.scss", "./skin/base.scss"]            }          }        ],        exclude: path.resolve(__dirname, "node_modules")      },      {        test: //.html$/,        use: {          loader: "html-loader",        }      },      { test: /src//containers(//.*).(tsx|ts)/, loader: "bundle-loader?lazy!ts-loader" },      { enforce: "pre", test: //.js$/, loader: "source-map-loader" }    ]  },}

配置plugins

plugins里面放的是插件,插件的作用在于提高開發效率,能夠解放雙手,讓我們去做更多有意義的事情。一些很low的事就統統交給插件去完成。

const webpackConfig = {  plugins: [    //清除文件    new CleanWebpackPlugin(),    //css單獨打包    new MiniCssExtractPlugin({      filename: "[name].css",      chunkFilename: "[name].css"    }),    // 引入熱更新插件    new webpack.HotModuleReplacementPlugin()   ]}

配置externals

如果需要引用一個庫,但是又不想讓webpack打包(減少打包的時間),并且又不影響我們在程序中以CMD、AMD或者window/global全局等方式進行使用(一般都以import方式引用使用),那就可以通過配置externals。

const webpackConfig = {  //項目編譯打包是忽略這些依賴包  externals: {    react: "React",    "react-dom": "ReactDOM",    "react-redux": "ReactRedux",  }}

配置mode

mode是webpack4新增的一條屬性,它的意思為當前開發的環境。mode的到來減少了很多的配置,它內置了很多的功能。相較以前的版本提升了很多,減少了很多專門的配置

  • 提升了構建速度
  • 默認為開發環境,不需要專門配置
  • 提供壓縮功能,不需要借助插件
  • 提供SouceMap,不需要專門配置

mode分為兩種環境,一種是開發環境(development),一種是生產環境(production)。開發環境就是我們寫代碼的環境,生產環境就是代碼放到線上的環境。這兩種環境的最直觀區別就是,開發環境的代碼不提供壓縮,生產環境的代碼提供壓縮。

配置devServer

const webpackConfig = {  devServer: {    // 本地服務器所加載的頁面所在的目錄    contentBase: srcPath,     //熱更新    hot: true,    //服務端口    port: "7788",    // 是否向Chunk中注入代理客戶端,默認注入    inline: true,     // publicPath: '/dist/',    historyApiFallback: {      index: "template.html",    },    //默認檢查hostname    disableHostCheck: true,    compress: true,    open: true // 自動打開首頁  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品自在久久| 最新69国产成人精品视频免费| 久久视频在线看| 久久精品中文字幕免费mv| 亚洲欧美激情精品一区二区| 亚洲欧美日韩综合| 日韩在线高清视频| 粉嫩老牛aⅴ一区二区三区| 亚洲乱码av中文一区二区| 久久久人成影片一区二区三区| 亚洲香蕉伊综合在人在线视看| 国产精品爽黄69天堂a| 亚洲a区在线视频| 欧美黑人国产人伦爽爽爽| 久久久极品av| 欧美日韩成人在线视频| 亚洲国产日韩欧美在线动漫| 亚洲国产婷婷香蕉久久久久久| 日本国产精品视频| 日韩欧美主播在线| 久久成人18免费网站| 九九热这里只有精品免费看| 国产视频久久网| 国产精品网红直播| 91九色国产社区在线观看| 91国内揄拍国内精品对白| 亚洲免费av电影| 日本成人在线视频网址| 久久国产精品99国产精| 最近中文字幕mv在线一区二区三区四区| 亚洲国产成人在线播放| 成人乱人伦精品视频在线观看| 亚洲人成网站在线播| 91欧美精品午夜性色福利在线| 2024亚洲男人天堂| 亚洲天堂开心观看| 青青久久av北条麻妃黑人| 日韩在线视频导航| 国产精品国产自产拍高清av水多| 国产一区欧美二区三区| 国产精品99导航| 亚洲色在线视频| 亚洲免费高清视频| 日韩大片在线观看视频| 国产美女精品免费电影| 欧美第一黄色网| 91精品国产综合久久香蕉最新版| 亚洲久久久久久久久久| 亚洲国产一区二区三区四区| 热re91久久精品国99热蜜臀| 国产精品久久色| 久久久人成影片一区二区三区| 国产欧美在线观看| 国产欧美日韩丝袜精品一区| 欧美精品在线视频观看| 一区二区亚洲欧洲国产日韩| 岛国av午夜精品| 国产视频亚洲视频| 欧美成人精品在线| 日韩极品精品视频免费观看| 国产精品日日摸夜夜添夜夜av| 国产精品久久久久久久久久久新郎| 在线视频亚洲欧美| 日韩av三级在线观看| 精品香蕉在线观看视频一| 亚洲字幕一区二区| 亚洲免费视频观看| 国产一区二区三区日韩欧美| 欧美激情第99页| xvideos国产精品| 亚洲最大激情中文字幕| 国产精品美女主播在线观看纯欲| 色香阁99久久精品久久久| 激情av一区二区| 国产成人在线亚洲欧美| 国产一区二区动漫| 福利精品视频在线| 夜夜嗨av色一区二区不卡| 久久成人精品一区二区三区| 国内免费精品永久在线视频| 日韩在线国产精品| 久久久久免费精品国产| 国产精品美女久久| 欧美影院成年免费版| 久久久久久亚洲精品不卡| 日韩一二三在线视频播| 欧美日韩国产中文精品字幕自在自线| 久久久99免费视频| 亚洲国产精品久久| 亚洲欧美日韩直播| 久久久久久久亚洲精品| 日韩精品在线观看一区二区| 粗暴蹂躏中文一区二区三区| 久久久久久久亚洲精品| 国产一区二区三区免费视频| 欧美日韩不卡合集视频| 在线播放日韩欧美| 中文字幕av一区中文字幕天堂| 中文字幕亚洲激情| 日韩精品视频在线免费观看| 国产99视频精品免视看7| 国产成人极品视频| 亚洲精品网站在线播放gif| 91欧美精品成人综合在线观看| 欧美性开放视频| 久久精品国产一区| 欧美黄色www| 8090成年在线看片午夜| 欧美一区三区三区高中清蜜桃| 日韩av一区二区在线观看| 日韩电影大片中文字幕| 久久久人成影片一区二区三区观看| 欧美疯狂做受xxxx高潮| 色香阁99久久精品久久久| 日韩中文字幕在线免费观看| 韩剧1988免费观看全集| 欧美体内谢she精2性欧美| 91精品91久久久久久| 91精品中文在线| 欧美孕妇孕交黑巨大网站| 欧美日韩亚洲天堂| 91精品国产高清久久久久久91| 欧美亚洲国产视频| 日韩视频欧美视频| 久久久久亚洲精品国产| 久久影视电视剧免费网站| www欧美xxxx| 国产精品h片在线播放| 亚洲一区二区三区乱码aⅴ| 亚洲欧美中文日韩在线| 欧美午夜久久久| 日韩在线视频中文字幕| www.久久草.com| 午夜精品一区二区三区视频免费看| 久久偷看各类女兵18女厕嘘嘘| 亚洲女人天堂成人av在线| 国产精品一区二区三区久久| 在线日韩中文字幕| 亚洲另类欧美自拍| 国产成人精品网站| 亚洲一区二区在线播放| 久久久人成影片一区二区三区| 久久成人av网站| 国产欧美va欧美va香蕉在| 欧美一级视频一区二区| 啪一啪鲁一鲁2019在线视频| 伊是香蕉大人久久| 国内精品小视频| 亚洲成人中文字幕| 亚洲国产精品免费| 国产精品一区二区久久国产| 国产精品盗摄久久久| 亚洲成人网av| 2021久久精品国产99国产精品| 欧美日韩免费观看中文| 成人情趣片在线观看免费| 亚洲欧美在线第一页| 一区二区三区高清国产| 久久夜色精品亚洲噜噜国产mv| 亚洲国产成人久久综合一区| 国产丝袜精品第一页| 亚洲第一区第一页| 亚洲精品理论电影| 欧美国产日韩一区|