typescript-react-webpack4 起手与踩坑
前言
webpack4正式版发布也有一段时间了, 为了从实际中感受变化, 于是以typescript, react, 结合之前翻译的一篇文章webpack-4.0更新日志(翻译), 搭建一个可供项目使用的框架.
项目状况
github
前往
项目已使用
- webpack-4
- typescript
- react
- react-router-4
- component hot reload
- async component
- css-module(import .(s)css auto generate .(s)css.d.ts)
- svg icon
待添加
- state management (Redux or Mobx)
- UI lib (Element-React)
- jest
主要库及版本
- webpack --------- 4.1.1
- typescript -------- 2.7.2
- react ------------ 16.2.0
- react-router-dom -- 4.2.2
- react-hot-loader --- 4.0.0
- ......
- node ------------- 8.9.4
坑
我是由另一个项目升级过来的, 因为原项目没用babel, 直接以ts-loader转.
原项目涉及到配置变化的库及版本
- webpack --------- 4.1.1
- react-hot-loader --- 3.1.3
原配置:
// tsconfig.json
{"compilerOptions": {"target": "es5","module": "es2015","moduleResolution": "node",....}
}
复制代码
// webpack.config.js
{test: /\.(ts(x?)|js(x?))$/,exclude: /node_modules/,rules: [{loader: 'react-hot-loader/webpack',},{loader: 'ts-loader',options: {transpileOnly: true}}
}
复制代码
Module not found: Error: Can't resolve 'react-hot-loader/webpack' in '/Users/jackple/Documents/react/ts-react-webpack4'
复制代码
果然跑不通, 符合心理预期!????
查看node_modules里面的react-hot-loader, 对比原项目node_modules的react-hot-loader, 文件结构改了不少, 看4.0.0的源码, 也不再有webpack目录, 而且代码中有这么一段:
throw new Error('React Hot Loader: You are erroneously trying to use a Babel plugin ' + 'as a Webpack loader. We recommend that you use Babel, ' + 'remove "react-hot-loader/babel" from the "loaders" section ' + 'of your Webpack configuration, and instead add ' + '"react-hot-loader/babel" to the "plugins" section of your .babelrc file. ' + 'If you prefer not to use Babel, replace "react-hot-loader/babel" with ' + '"react-hot-loader/webpack" in the "loaders" section of your Webpack configuration. ');
复制代码
提示信息与实际不符, 估计提示没改过来, 还是用babel吧(其实它的README也是建议用babel), 免得挣扎!!
按照react-hot-loader官方推荐做法以及demo
When using TypeScript, Babel is not required, but React Hot Loader will not work without it. Just add babel-loader into your Webpack configuration, with React Hot Loader plugin.
{test: /\.tsx?$/,use: [{loader: 'babel-loader',options: {babelrc: true,plugins: ['react-hot-loader/babel'],},},'ts-loader', // (or awesome-typescript-loader)],
}
复制代码
You also have to modify your tsconfig.json:
// tsconfig.json
{"module": "commonjs","target": "es6"
}
复制代码
// xxx.tsx
import { hot } from 'react-hot-loader'
...
export default hot(module)(Component)
复制代码
- 首先是react-hot-loader/babel, 无论是按官方推荐配置, 还是写在.babelrc, 以上两者都加上环境判断, 开发环境没问题, 可是打包出来的生产环境代码看起来怪怪的:
...
default = i, u = r(4).
default, s = r(4).leaveModule, u && (u.register(l, "Error", "/Users/jackple/Documents/react/ts-react-webpack4/src/components/Error/index.tsx"), u.register(i, "default", "/Users/jackple/Documents/react/ts-react-webpack4/src/components/Error/index.tsx"), s(e))
}).call(this, r(12)(e))
...
复制代码
怎么看都不合理呀! 为什么会出来我的本地源文件路径! 本地开nginx调试生产环境代码, 虽然能跑, 不过, 这不是我想要的!
最后, 这部分的处理结果是把react-hot-loader/babel删除之! 再将tsx接受hot reload还原为旧式写法:
import { AppContainer } from 'react-hot-loader'import AppRouter from './router'const render = Component => {ReactDOM.render(<AppContainer><Component /></AppContainer>,document.getElementById('app') as HTMLElement)
}render(AppRouter)// Hot Module Replacement API
if (module.hot) {module.hot.accept(['router'], () => {import('./router').then(mod => render(mod.default))})
}复制代码
- 再者是为配合webpack4的代码分割(dynamic import), 需要把tsconfig.json中的module置为esnext(主要是为了让typescript不编译import), 不知道是不是我配置失误, 显示以下错误:
ERROR in ./src/index.tsx
Module build failed: SyntaxError: 'import' and 'export' may only appear at the top level (14:8)12 | if (module.hot) {13 | module.hot.accept(['router'], () => {
> 14 | import('./router').then(mod => render(mod.default));| ^15 | });16 | }
复制代码
不是说好的支持import语法了咩? 最后还是要加上syntax-dynamic-import的babel插件
- css module提取
new ExtractTextPlugin({filename: assetsPath('css/[name].[contenthash].css')
})
复制代码
bootstrap:74 Uncaught (in promise) TypeError: Cannot read property 'call' of undefinedat i (bootstrap:74)at Object.31 (index.css:1)at i (bootstrap:74)at Object.32 (index.css?f62f:2)at i (bootstrap:74)at Object.52 (index.tsx:3)at i (bootstrap:74)at index.tsx:9at <anonymous>
复制代码
异步组件的css提取问题, 暂以提取所有css到一个文件中告终, 即:
new ExtractTextPlugin({allChunks: true,filename: assetsPath('css/[name].[contenthash].css')
})
复制代码
过程曲折, 还有一些问题没写上, 具体请参考项目...
如果大家有更好的解决方案, 也欢迎评论或提issue
typescript-react-webpack4 起手与踩坑相关推荐
- vue-cli3.0+webpack4中关于svg-sprite-loader踩坑,让svg组件徜徉我的web项目
第一次写文章,今天踩坑过后希望能够记录这样'生动有趣'的踩坑之旅,还是那样,在技术的海洋中,我和大佬就像鱼和水,我没了大佬就凉了,大佬没了我还清净,感谢一路栽培.公司之前的项目都是用vue-cli2. ...
- React Native小菜鸡的踩坑排雷记录(4)
一.Text增加点击态效果 在RN里,我们经常会遇到点击文字或者按钮有响应的.其中,我们的一些按钮是Text+style 去实现一个按钮样式的.当我们点击文字的时候,会出现只有文字被选中的阴影,而不是 ...
- React Native小菜鸡的踩坑排雷记录(1)
只是记录一下自己遇到的些许问题和解决方案的汇总,方便以后查阅. 废话不多说,直接上重点:(遇到的难题) 一.antd-design组件难以自定义样式 这里 antd-design 不像web一样,可以 ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- eslint 无法格式化ts_vscode-eslint的踩坑实践--typescript无法格式化
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > vscode-eslint的踩坑实践--typescript无法格式 ...
- [react] 在使用react过程中你都踩过哪些坑?你是怎么填坑的?
[react] 在使用react过程中你都踩过哪些坑?你是怎么填坑的? 组件不像Vue一样有(beforeRouteLeave, beforeRouteEnter)路由守卫 Hooks中的闭包渲染问题 ...
- truffle unbox react 初始化踩坑
truffle unbox react 初始化踩坑 1.文件位置引起的错误 一定要在package.json 所在文件夹下npm run start ,新版本一定要进入client文件夹再npm ru ...
- React Native之React Navigation踩坑
自动重装系统之后,已经很长一段时间没有来写React Native了,今天空闲之余,决定重新配置React Native的开发环境,继续踩坑... React Native的开发环境配置狠简单,只要依 ...
- 丰田项目踩坑手记(REACT)
丰田项目踩坑手记(REACT) 路由配置的时候:要引入hash路由不是browswer那个 路由参考网址:react-guide.github.io/react-route- 路由网址:reacttr ...
- DIY组装电脑踩坑,手残党DIY装机分享!
面试造火箭,上班拧螺丝,身为一个合格的打工人(打螺丝种子选手),拧螺丝可能是常规操作,而真相是手残党得硬着头皮打螺丝,故有了以下这篇DIY组装电脑踩坑之旅,本渣渣的手残党DIY装机图文分享,图片比较多 ...
最新文章
- intellij tomcat配置
- Python的捕虫笔记
- vue弹出alert_vue+webpack 实现简单的弹窗(alert)组件
- turtle生成二叉树
- python map什么意思_Python中map是什么意思
- javascript座标_javascript JS元素位置和位置坐标
- mysql5.7主从复制--在线变更复制类型【转】
- 知识蒸馏方法的演进历史综述
- 搭建nginx代理,为前端页面跨域调用接口
- 校园江湖前情回顾(一二三)
- win10如何查看服务器日志文件,win10日志文件在哪里?小编教你查看win10日志文件的方法...
- python爬取堆糖网每日精选图片
- IDEA的插件,IDEA强大的插件库
- 滑动差分倒谱系数 matlab,【网安学术】基于音频特征参数的多语种分类算法
- 专题分纲目录 MEM/MBA数学强化
- 邮票问题---动态规划
- 基于easyui 1.3.6设计的后台管理系统模板界面
- 计算机毕业设计 基于JavaWbe的校友录管理系统(源码+论文)
- 超声波液位计丢波状态该如何解决呢?
- 北京发布《政务服务领域区块链应用创新蓝皮书》| 附下载
热门文章
- python unpack_Python使用struct处理二进制(pack和unpack用法)
- 苹果系统和安卓系统的区别_Android和iPhone的区别?还不如说安卓系统和IOS系统的差别...
- PyTorch1.4安装(Anaconda3 + Python3.6 + cpu版本)
- 例2.8 叠筐 - 九度教程第15题(排版题)
- 过椭圆外一点引两条切线方程_S16-2 二次曲线和圆方程
- Netty文章目录汇总
- 在CentOS 7中安装Jetty服务器
- reactJS -- 14 Router 概念
- 《嵌入式 Linux C 语言应用程序设计(修订版)》——2.1 嵌入式Linux下C语言概述...
- ARM介绍1:发展史