微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将typescript+react的webpack项目迁移到parcel

parcel简介

Parcel,是一个网络应用打包工具,适用于经验不同的开发者. 它利用多核处理提供了极快的速度,并且不需要任何配置.

项目github地址

现状

对于现阶段来说,对已有的成熟的webpack项目,玩一下还是可以的,但是不建议公司项目迁移,坑必须还是很多的.

极速?

有对比才有伤害,以下是我针对上面的两个自己的github项目做的对比(都是跑生成环境):

首次:
webpack:
Hash: 934e621452b0231ded89
Version: webpack 3.8.1
Time: 8981ms

parcel:
built in 15.56s.

第二次:
webpack:
Hash: 934e621452b0231ded89
Version: webpack 3.8.1
Time: 9065ms

parcel:
Built in 3.41s.

parcel在第二次利用cache的情况下,速度还是有很大优势的

零配置?

这个零配置不可以一概而论,比如项目中有用到css module,babel的,还是要配置的,这个视乎使用者怎么看,不过确实比webpack少配置很多

迁移过程中需要改的

首先要说明一下,这是基于ts-react(webpack)修改的,遇到的问题并不一定与大家的相吻合

ts-loader -> babel

parcel内置babel,编译的过程中会调用babel去转译代码

webpack.DefinePlugin -> 启动前设置procee.env

webpack定义全局变量使用的是DefinePlugin,parcel没有提供类似的方式,只能在启动前设置

cross-env APP_ENV=dev BASE_URL=http://rap2api.taobao.org parcel serve index.html -o

不过现在新开了一个issue,利用.env去实现,估计很快能用.

css module

webpack项目中通过对应loader以及"modules"关键字的方式实现,现在改由仅.postcssrc配置实现,这个方法一个缺点,一旦设置,就是全局的,查看issue

另外还有一个生成css module deFinition的问题,webpack项目中通过typings-for-css-modules-loader(其实体验不太好),现在改由typed-css-modules通过命令行生成,现在是新开一个命令行窗口去运行(npm run by package.json)

"tcm": "tcm src -c -w",

import

webpack允许用户import一个模块时使用非标准的路径,比如

import 'styles/app.scss'

也可以在webpack配置中声明alias

alias: {
    'assets': resolve('src/assets')
}

在parcel中,我们就必须把项目视为一个标准的node工程,所有的导入导出都必须遵循标准语法

typescript dynamic import

webpack2,3在动态加载模块这一个功能点上较webpack1强大了许多,刚刚出来时吹的很厉害,支持包括System.import这样的语法,可是这毕竟是基于SystemJS的语法,在parcel中就不适用了,不过可以直接使用import,这个问题不是很大,同时需要修改tsconfig

"compilerOptions": {
    "module": "esnext"
    ...

sourceMaps

不支持,查看issue,这个会是很多人止步的原因

react-hot-loader

webpack中的使用方式为:

  1. 修改webpack entry
entry: {
    app: [
      'react-hot-loader/patch','webpack-hot-middleware/client','./src/index.tsx'
    ]
  }
  1. 入口修改
import { AppContainer } from 'react-hot-loader'

const render = (Component) => {
  ReactDOM.render(
    <Provider {...store}>
      <AppContainer warnings={false}>
        <Component />
      </AppContainer>
    </Provider>,document.getElementById('app') as HTMLElement
  )
}

render(App)

// Hot Module Replacement API
if (module.hot) {
  module.hot.accept(['router'],() => {
    const NextApp = require<RequireImport>('router').default
    render(NextApp)
  })
}

parcel的使用方式为有两种:

  1. 入口处修改
import('react-hot-loader/patch')
  1. 修改.babelrc
{
  "plugins": [
    ...
    "react-hot-loader/patch"
  ],...
}

这个配置就算是非常简单了,个人用的是第2种

总结

相对于webpack而言,parcel的配置成本会低一点,可是,配置成本不代表使用成本,在实际项目中,应用构建的过程可能需要额外做的一些工作,在webpack上可能实现起来很方便,可是用parcel就必须要写插件才能实现,那算起来,这也是一种额外的成本

parcel github少两天没看又多了将近1000star,确实很了不起,前景个人认为还是杠杠的. 风暂时都是国外同行在吹,使用过程中遇到得很多问题,google用中文搜的话建议你还是放弃吧.

有说错的地方还请指出,见谅!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...