前言

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)
复制代码
  1. 首先是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))})
}复制代码
  1. 再者是为配合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插件

  1. 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 起手与踩坑相关推荐

  1. vue-cli3.0+webpack4中关于svg-sprite-loader踩坑,让svg组件徜徉我的web项目

    第一次写文章,今天踩坑过后希望能够记录这样'生动有趣'的踩坑之旅,还是那样,在技术的海洋中,我和大佬就像鱼和水,我没了大佬就凉了,大佬没了我还清净,感谢一路栽培.公司之前的项目都是用vue-cli2. ...

  2. React Native小菜鸡的踩坑排雷记录(4)

    一.Text增加点击态效果 在RN里,我们经常会遇到点击文字或者按钮有响应的.其中,我们的一些按钮是Text+style 去实现一个按钮样式的.当我们点击文字的时候,会出现只有文字被选中的阴影,而不是 ...

  3. React Native小菜鸡的踩坑排雷记录(1)

    只是记录一下自己遇到的些许问题和解决方案的汇总,方便以后查阅. 废话不多说,直接上重点:(遇到的难题) 一.antd-design组件难以自定义样式 这里 antd-design 不像web一样,可以 ...

  4. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  5. eslint 无法格式化ts_vscode-eslint的踩坑实践--typescript无法格式化

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > vscode-eslint的踩坑实践--typescript无法格式 ...

  6. [react] 在使用react过程中你都踩过哪些坑?你是怎么填坑的?

    [react] 在使用react过程中你都踩过哪些坑?你是怎么填坑的? 组件不像Vue一样有(beforeRouteLeave, beforeRouteEnter)路由守卫 Hooks中的闭包渲染问题 ...

  7. truffle unbox react 初始化踩坑

    truffle unbox react 初始化踩坑 1.文件位置引起的错误 一定要在package.json 所在文件夹下npm run start ,新版本一定要进入client文件夹再npm ru ...

  8. React Native之React Navigation踩坑

    自动重装系统之后,已经很长一段时间没有来写React Native了,今天空闲之余,决定重新配置React Native的开发环境,继续踩坑... React Native的开发环境配置狠简单,只要依 ...

  9. 丰田项目踩坑手记(REACT)

    丰田项目踩坑手记(REACT) 路由配置的时候:要引入hash路由不是browswer那个 路由参考网址:react-guide.github.io/react-route- 路由网址:reacttr ...

  10. DIY组装电脑踩坑,手残党DIY装机分享!

    面试造火箭,上班拧螺丝,身为一个合格的打工人(打螺丝种子选手),拧螺丝可能是常规操作,而真相是手残党得硬着头皮打螺丝,故有了以下这篇DIY组装电脑踩坑之旅,本渣渣的手残党DIY装机图文分享,图片比较多 ...

最新文章

  1. intellij tomcat配置
  2. Python的捕虫笔记
  3. vue弹出alert_vue+webpack 实现简单的弹窗(alert)组件
  4. turtle生成二叉树
  5. python map什么意思_Python中map是什么意思
  6. javascript座标_javascript JS元素位置和位置坐标
  7. mysql5.7主从复制--在线变更复制类型【转】
  8. 知识蒸馏方法的演进历史综述
  9. 搭建nginx代理,为前端页面跨域调用接口
  10. 校园江湖前情回顾(一二三)
  11. win10如何查看服务器日志文件,win10日志文件在哪里?小编教你查看win10日志文件的方法...
  12. python爬取堆糖网每日精选图片
  13. IDEA的插件,IDEA强大的插件库
  14. 滑动差分倒谱系数 matlab,【网安学术】基于音频特征参数的多语种分类算法
  15. 专题分纲目录 MEM/MBA数学强化
  16. 邮票问题---动态规划
  17. 基于easyui 1.3.6设计的后台管理系统模板界面
  18. 计算机毕业设计 基于JavaWbe的校友录管理系统(源码+论文)
  19. 超声波液位计丢波状态该如何解决呢?
  20. 北京发布《政务服务领域区块链应用创新蓝皮书》| 附下载

热门文章

  1. python unpack_Python使用struct处理二进制(pack和unpack用法)
  2. 苹果系统和安卓系统的区别_Android和iPhone的区别?还不如说安卓系统和IOS系统的差别...
  3. PyTorch1.4安装(Anaconda3 + Python3.6 + cpu版本)
  4. 例2.8 叠筐 - 九度教程第15题(排版题)
  5. 过椭圆外一点引两条切线方程_S16-2 二次曲线和圆方程
  6. Netty文章目录汇总
  7. 在CentOS 7中安装Jetty服务器
  8. reactJS -- 14 Router 概念
  9. 《嵌入式 Linux C 语言应用程序设计(修订版)》——2.1 嵌入式Linux下C语言概述...
  10. ARM介绍1:发展史