• Webpack 搭建 Vue + ts + tsx


    webpack5 + vue2.7

    主要依赖包

    • webpack@5.74.0
    • webpack-cli@4.10.0
    • webpack-dev-server@4.11.0
    • vue@2.7.10
    • typescript@4.8.3
    • vue-loader@15.10.0 
    • @babel/core@7.17.5
    • @babel/preset-env@7.16.11
    • babel-loader@8.2.3
    • html-webpack-plugin@5.5.0
    • mini-css-extract-plugin@2.5.3
    • less@2.13.1
    • less-loader@7.3.0
    • css-loader@6.6.0

    下面列出主要的配置。

    Babel.config.js

    1. module.exports = {
    2. presets: [
    3. [
    4. '@babel/preset-env',
    5. {
    6. targets: {
    7. chrome: 84
    8. }
    9. },
    10. ],
    11. ]
    12. }

    webpack.config.js

    1. ...
    2. module: {
    3. rules: [
    4. {
    5. test: /\.vue$/,
    6. loader: 'vue-loader'
    7. },{
    8. test: /\.(j|t)sx?$/,
    9. exclude: /node_modules/,
    10. use:[
    11. 'babel-loader',
    12. {
    13. loader: 'ts-loader',
    14. options: {
    15. appendTsSuffixTo: [/\.vue$/],// 重要
    16. transpileOnly: true,// 重要
    17. happyPackMode: false,
    18. }
    19. }
    20. ]
    21. },
    22. ]
    23. },
    24. resolve: {
    25. extensions: ['.ts','.tsx', '.js','.vue'],
    26. ...
    27. }
    28. ...

    tsconfig.json (同vue-cli 生成的,修改jsx:"react")

    1. {
    2. "compilerOptions": {
    3. "target": "esnext",
    4. "module": "esnext",
    5. "strict": true,
    6. "jsx": "react", // preserve会报错,不知道vue-cli怎么做的
    7. "moduleResolution": "node",
    8. "skipLibCheck": true,
    9. "esModuleInterop": true,
    10. "allowSyntheticDefaultImports": true,
    11. "forceConsistentCasingInFileNames": true,
    12. "useDefineForClassFields": true,
    13. "sourceMap": true,
    14. "baseUrl": ".",
    15. "types": [
    16. "webpack-env"
    17. ],
    18. "paths": {
    19. "@/*": [
    20. "src/*"
    21. ]
    22. },
    23. "lib": [
    24. "esnext",
    25. "dom",
    26. "dom.iterable",
    27. "scripthost"
    28. ]
    29. },
    30. "include": [
    31. "src/**/*.ts",
    32. "src/**/*.tsx",
    33. "src/**/*.vue",
    34. "tests/**/*.ts",
    35. "tests/**/*.tsx"
    36. ],
    37. "exclude": [
    38. "node_modules"
    39. ]
    40. }

    小结

    主要是ts 和tsx 的处理。不用ts的情况下, 网上说用babel 的transform-vue-jsx 等插件完成jsx解析。

    由于ts-loader 会处理jsx语法,在tsconfig.json 中配置 compilerOptions.jsx = 'react' 即可,设preserve会报错。要注意ts-loader 配置,appendTsSuffixTo 和 transpileOnly,不配置的话会报错。

    因此,这里 babel 的配置很干净,没有处理有关 jsx 的 preset 和 plugin。

    若报错webpack-env的类型问题,则npm i @types/webpack-env即可。

    后续

    使用swc 替换ts-loader 加速构建webpack-vue-tsx项目_JA+的博客-CSDN博客

    其他

    有的文章说:“ts-loader编译太慢!我不用 ts-loader!” 可以用 babel 配合 @babel/preset-typescript 预设来解析ts即可。(试了一下没成功)

    通过

    vue inspect > output.js

     命令导出vue-cli 的webpack配置,用于参考。

  • 相关阅读:
    Vue2与Vue3区别01
    npm设置淘宝镜像地址
    1.创建Django项目
    Redis主从复制+哨兵选举机制分析
    Linux下企业级夜莺监控分析工具的远程访问设置【内网穿透】
    iOS UIDevice设备信息
    让工作效率至少快一倍的秘诀:清单革命
    centos8手动编译安装swoole过程
    axios升级依赖版本后报错SyntaxError: Cannot use import statement outside a module
    SpringCore 完整学习教程1,入门级别
  • 原文地址:https://blog.csdn.net/qq_35459724/article/details/127850592