• babel的配置执行顺序


     babel配置文件:

    1. //.babelrc
    2. {
    3. "presets": [
    4. "@babel/preset-env",
    5. "@babel/preset-react"
    6. ],
    7. "plugins": [
    8. "@babel/plugin-proposal-class-properties",
    9. [
    10. "@babel/plugin-transform-runtime",
    11. {
    12. "corejs": {
    13. "version": 3,
    14. "proposals": true
    15. },
    16. "helpers": true,
    17. "regenerator": true
    18. }
    19. ],
    20. [
    21. "import",
    22. {
    23. "libraryName": "antd"
    24. },
    25. "antd"
    26. ],
    27. [
    28. "import",
    29. {
    30. "libraryName": "lodash",
    31. "libraryDirectory": "",
    32. "camel2DashComponentName": false
    33. },
    34. "lodash"
    35. ]
    36. ]
    37. }

    业务代码:

    1. import _ from 'lodash';
    2. //枚举翻译
    3. valToText = () => {
    4. const { customeName, useColField, quantOption, children, record, uikey } = this.props;
    5. // 自定义按钮文案
    6. if (customeName) {
    7. // 使用列字段
    8. if (useColField && !_.isEmpty(uikey)) {
    9. return _.get(record, uikey, '');
    10. }
    11. // 使用数据字典
    12. if (_.isArray(quantOption) && !_.isEmpty(uikey)) {
    13. const currentOption = _.find(quantOption, ({ value }) => record[uikey] === value);
    14. const text = _.get(currentOption, 'name', record[uikey]);
    15. return text;
    16. }
    17. }
    18. return children;
    19. }

    对业务代码打包:

    "build": "babel _components --out-dir dist --ignore \"**/*.test.js\" --copy-files",

    打包后的文件运行报错:find函数调用报错

    对应打包代码: 

      find函数打印如下:后面括号的_报错

    _.find()和[].find,即把_当成了数组处理,所以数组的find函数调用后是(0, _find2.default)([])

    (0, _find2.default)(_)

    如下其他lodash函数正常,find函数被babel处理polyfill,将find当成了数组的findpolyfill了


    修改find函数引入

    import _, { find } from 'lodash';

     打包后正常:

    var _find3 = _interopRequireDefault(require("lodash/find"));

    Babel配置说明:

    presets与plugins同时存在的执行顺序

    1. plugins运行在presets之前;

    2. plugins配置项,按照声明顺序执行,从第一个到最后一个;

    3. presets配置项,按照声明逆序执行,从最后一个到第一个(主要是为了确保向后兼容)

    stage-x:指处于某一阶段的js语言提案
    • Stage 0 - 设想(Strawman):只是一个想法,可能有 Babel插件。
    • Stage 1 - 建议(Proposal):这是值得跟进的。
    • Stage 2 - 草案(Draft):初始规范。
    • Stage 3 - 候选(Candidate):完成规范并在浏览器上初步实现。
    • Stage 4 - 完成(Finished):将添加到下一个年度版本发布中

    stage-x的参数列表请参考:https://github.com/babel/babel/blob/master/packages/babel-preset-stage-0/README.md

    babel7中删除了"stage-x"的预设;建议使用env,代替 es2015、es2016、es2017预设

    解决:

    所以上面babelrc中配置,先执行了@babel/plugin-transform-runtime 误将_.find当成了数组处理,之后在按需加载lodash,顺序错误,应该先引入lodash的find之后再执行polyfill,就不会误处理。

    1. "plugins": [
    2. "@babel/plugin-proposal-class-properties",
    3. [
    4. "import",
    5. {
    6. "libraryName": "antd"
    7. },
    8. "antd"
    9. ],
    10. [
    11. "import",
    12. {
    13. "libraryName": "lodash",
    14. "libraryDirectory": "",
    15. "camel2DashComponentName": false
    16. },
    17. "lodash"
    18. ],
    19. [
    20. "@babel/plugin-transform-runtime",
    21. {
    22. "corejs": {
    23. "version": 3,
    24. "proposals": true
    25. }
    26. }
    27. ]
    28. ]

    直接写 import _ from 'lodash';import { isEqual } from 'lodash'; 引入的是整个 Lodash 包,约 70kb 左右(压缩后)

    import isEqual from 'lodash/isEqual'; 引入的单个使用到的文件,约 15kb 左右(压缩后)。

    项目开发时,要注意按需加载,减少代码体积,lodash引入问题,新项目推荐使用 lodash-es 包,因为这可以省去 babel 编译的时间。

    老项目存在替换成本,可以使用babel-plugin-lodash或上面的babel-plugin-import实现按需加载。

  • 相关阅读:
    【vue3】传送组件、Teleport
    山形三元组
    python基础-数据结构——hash表、线性探测、二重探测、双重哈希、闭散列(分离链接)(拉链法)Python代码实现
    Altium Designer智能粘贴命令的使用教程
    Python独具特色的语法规范点梳理
    Android Studio 插件开发1、创建标题 通知等
    Java 中的深拷贝和浅拷贝你了解吗?
    STM32之蜂鸣器实验
    软件开发方法与需求分析
    electron 基础
  • 原文地址:https://blog.csdn.net/CamilleZJ/article/details/133306951