应如何配置 VSCode 以支持 Lerna Monorepo?

2024-03-15

我有一个lerna https://github.com/lerna/lernamonorepo 包含很多包。

我正在努力实现以下目标:

  1. 确保 VSCode 提供从一个包到另一个包的正确导入建议(基于包名称,而不是相对路径)。
  2. 确保我可以“打开定义”这些导入之一并转到该文件的 src。

对于 1. 我的意思是,如果我在 package-a 中导航代码并开始键入 package-b 导出的函数,我会收到一条建议,该建议将触发添加导入: `import { example } from 'package- b'。

对于 2。我的意思是,如果我在从导入该文件的不同包中导航该文件时,按住“package-b”导出的函数的名称,我将被带到“/packages/namespace/package/b” /src/file-that-c​​ontains-function.js',

我的(lerna)monorepo 的结构是标准的,例如这里是一个“组件”包,发布为@namespace/components.

- packages
    - components
       - package.json
       - node_modules
       - src
         - index.js
         - components
           - Button
             - index.js
             - Button.js
       - es
         - index.js
         - components
           - Button
             - index.js
             - Button.js

请注意,每个组件都由一个目录表示,以便在必要时它可以包含其他组件。在这个例子中,packages/components/index出口Button作为命名导出。文件被转换为包的/es/目录。

默认情况下,VSCode 为导入提供自动建议,但它会被这种结构混淆,并且如果需要使用 monorepo 中的不同包Button例如,将自动建议以下所有导入路径:

  • packages/components/src/index.js
  • packages/components/src/Button/index.js
  • packages/components/src/Button/Button.js
  • packages/components/es/index.js
  • packages/components/es/Button/index.js
  • packages/components/es/Button/Button.js

然而,这些都不合适,因为它们将呈现为从导入文件到导入文件的相对路径。在这种情况下,以下导入是正确的导入:

import { Button } from '@namespace/components'

将排除添加到项目中jsconfig.json对建议路径没有影响,甚至不会删除以下位置的建议/es/*:

{
  "compilerOptions": {
    "target": "es6",
  },
  "exclude": [
    "**/dist/*",
    "**/coverage/*",
    "**/lib/*",
    "**/public/*",
    "**/es/*"
  ]
}

使用“compilerOptions”显式添加路径也无法在文件之间建立正确的关系:

{
  "compilerOptions": {
    "target": "es6",
    "baseUrl": ".",
    "paths": {
      "@namespace/components/*": [
        "./packages/namespace-components/src/*.js"
      ]
    }
  },
}

目前,Cmd/单击从不同包导入无法打开任何内容(未找到定义)。

我应该如何配置 VSCode 以便:

  1. VSCode 使用命名空间包作为导入值自动建议从 monorepo 中的其他包导入。
  2. 使用“打开定义”将我带到该文件的 src。

根据要求,我在根目录中有一个 babel 配置:

const { extendBabelConfig } = require(`./packages/example/src`)

const config = extendBabelConfig({
  // Allow local .babelrc.js files to be loaded first as overrides
  babelrcRoots: [`packages/*`],
})

module.exports = config

其中延伸:

const presets = [
  [
    `@babel/preset-env`,
    {
      loose: true,
      modules: false,
      useBuiltIns: `entry`,
      shippedProposals: true,
      targets: {
        browsers: [`>0.25%`, `not dead`],
      },
    },
  ],
  [
    `@babel/preset-react`,
    {
      useBuiltIns: true,
      modules: false,
      pragma: `React.createElement`,
    },
  ],
]

const plugins = [
  `@babel/plugin-transform-object-assign`,
  [
    `babel-plugin-styled-components`,
    {
      displayName: true,
    },
  ],
  [
    `@babel/plugin-proposal-class-properties`,
    {
      loose: true,
    },
  ],
  `@babel/plugin-syntax-dynamic-import`,
  [
    `@babel/plugin-transform-runtime`,
    {
      helpers: true,
      regenerator: true,
    },
  ],
]

// By default we build without transpiling modules so that Webpack can perform
// tree shaking. However Jest cannot handle ES6 imports becuase it runs on
// babel, so we need to transpile imports when running with jest.
if (process.env.UNDER_TEST === `1`) {
  // eslint-disable-next-line no-console
  console.log(`Running under test, so transpiling imports`)
  plugins.push(`@babel/plugin-transform-modules-commonjs`)
}

const config = {
  presets,
  plugins,
}

module.exports = config

在你的情况下,我会利用lerna https://yarnpkg.com/lang/en/docs/workspaces/结合纱线工作区 https://yarnpkg.com/lang/en/docs/workspaces/。 跑步时yarn install,您的所有包都链接在您的@namespace在全球范围内node_modules文件夹。这样,您就获得了 IntelliSense。

我在这里设置了一个示例存储库:https://github.com/flolude/stackoverflow-lerna-monorepo-vscode-intellisense https://github.com/flolude/stackoverflow-lerna-monorepo-vscode-intellisense

你只需要添加"useWorkspaces": "true"给你的lerna.json

lerna.json

{
  "packages": ["packages/*"],
  "version": "0.0.0",
  "useWorkspaces": "true"
}

剩下的只是适当的命名:

global package.json

{
  "name": "namespace",
  // ...
}
package.json of your component package

{
  "name": "@namespace/components",
  "main": "src/index.js",
  // ...
}
package.json of the package that imports the components

{
  "name": "@namespace/components",
  "main": "src/index.js",
  "dependencies": {
     "@namespace/components":"0.0.0"
  }
  // ...
}

然后您可以执行以下操作:

import { Component1 } from '@namespace/components';

// your logic

自动导入自@namespace

不幸的是,我找不到一种方法可以在 VSCode 中使用 Javascript Monorepo 实现此功能。但您可以做一些事情:

  1. 使用打字稿(tutorial https://medium.com/@caludio/how-to-use-module-path-aliases-in-visual-studio-typescript-and-javascript-e7851df8eeaa, 其他教程 https://youtu.be/EoqzOEZIzhg)
  2. Use 模块别名 https://www.npmjs.com/package/module-alias
  3. Add import {} from '@namespace/components' to the top of your file add import to file
  4. Use Auto Import https://marketplace.visualstudio.com/items?itemName=steoates.autoimport Extension auto import
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应如何配置 VSCode 以支持 Lerna Monorepo? 的相关文章

  • 使用 .add() 选择多个 jQuery 对象

    是否 add http api jquery com add 方法允许一次选择多个对象而不是一次添加一个 one add two add three add four on click function 以下变量的设置方式相同 因为每个变量
  • 有没有办法根据渲染的字符串创建 DOM 对象?

    有没有办法从整个字符串而不只是innerHTML 创建DOM 对象 我有一个完整呈现的 DOM 形式的字符串
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 如何使用 jQuery 在按下按钮后保持按钮处于活动状态

    我见过一些非常相似的问题 但一直无法找到我正在寻找的答案 我已经确定了解决方法 但想知道执行该任务的正确方法 我想要的是单击按钮并使活动状态保持不变 下一次单击将切换状态 这是所需的 我真正需要知道的是如何解决 uiButton activ
  • asp.net 将值从 JS/jquery 传递到 C# 背后的代码

    我已经尝试了 所有 可能的方法 将 screen width vlaue 从 aspx 页面上的 JS 脚本发送到后面代码中的 c 虽然我可以看到 screen width 被正确分配 但它永远不会分配给我的隐藏字段价值
  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • 根据传递的参数覆盖 Javascript 函数

    是否可以根据传递给函数的参数数量来重写函数 例如 function abc name document write My name is name function abc name friend document write My nam
  • React Native TypeError:无法读取未定义的属性“createClient”

    我是 React 本机框架的新手 我使用 create react native app AwesomeProject 创建了应用程序 我想在我的项目中使用 BLE 因此我安装了 react native ble plx 模块 但是当我创建
  • 尝试注册 RCTBridgeModule 类 RCTFileReaderModule

    尝试为名称 FileReaderModule 注册 RCTBridgeModule 类 RCTFileReaderModule 但该名称已由类 FileReaderModule 注册 尝试使用命令react native run ios在i
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • Intro.js 2页然后返回首页

    我在用intro js http introjs com 为我的网站创建一个小介绍 我希望游览从第 1 页 主页 2 另一页 然后回到第 1 页 主页 我已经成功地从第 1 2 页开始 但不确定如何让它返回到第 1 页 我对 javascr
  • Angularjs - 将 True/False 显示为 Yes/No

    有没有一种简单的方法可以将真 假值显示为是 否 我正在从数据库检索包含以下内容的 JSON 对象 对象 WithCertification true 这是 HTML 有认证 elem WithCertification 正在显示这个 认证真
  • VS Code 忽略 pylint 的设置

    我正在尝试禁用 VS Code 中的某些 pylint 警告 但我所做的一切似乎都不起作用 我已在所有 3 个可能的位置 用户 远程 工作空间 中放置了相同的设置 但 pylint 输出窗口中显示的命令行并未反映它 我尝试过重新启动 禁用
  • 模拟节点外部模块默认使用 jest 的链式方法

    在我们的节点 CLI 中 我们有一个简单的方法 use strict const ora require ora module exports function startSpinner textOnStart color spinnerT
  • YouTube iFrame Player API 无法在 DOMWindow 上执行 postMessage

    我正在尝试使用以下命令将 youtube 加载到我的网页中YouTube iFrame Player API 并在加载时出现以下错误 Failed to execute postMessage on DOMWindow The target
  • 这个 JQuery 指令做什么 $(function(){...}) [重复]

    这个问题在这里已经有答案了 我最近一直在研究JQuery 尽管我知道一些东西 但书上有这样一句话我根本无法理解 function current entry 1 有谁知道这条线是如何工作的以及它的作用是什么 它类似于 JQuery 函数中的
  • JsGrid 将嵌套对象加载到表中

    我正在 Django 中开发一个 Web 项目并使用 jsGrid 我遇到了问题并且找不到解决方案 我有一个嵌套的 JSON 数据 它是通过组合多个数据库表记录创建的 这是我的 JSON count 3 results personnel
  • Angular 2:使用正则表达式进行数字验证

    我正在尝试验证 IE 11 中的数字字段

随机推荐