vitejs / vite

Next generation frontend tooling. It's fast!
http://vite.dev
MIT License
68.67k stars 6.2k forks source link

[vite/plugin] The "attributes" property of ModuleInfo is not supported. #15411

Open vdegenne opened 11 months ago

vdegenne commented 11 months ago

Describe the bug

When using this.getModuleInfo(id).attributes in a plugin (for instance in transform hook) the following error occurs :

[vite] The "attributes" property of ModuleInfo is not supported.

But the same code works in native Rollup plugins.

related issue: Support for moduleInfo.meta in resolveId hook still not equivalent in vite dev and vite build

Reproduction

https://stackblitz.com/edit/vitejs-vite-5et2xu?file=vite.config.js&terminal=dev

System Info

System:
    OS: Linux 6.5 Fedora Linux 37 (Workstation Edition)
    CPU: (16) x64 AMD Ryzen 9 5900HS with Radeon Graphics
    Memory: 6.49 GB / 15.02 GB
    Container: Yes
    Shell: 5.9 - /usr/bin/zsh
  Binaries:
    Node: 20.10.0 - /usr/local/bin/node
    Yarn: 1.22.21 - /usr/local/bin/yarn
    npm: 10.2.3 - /usr/local/bin/npm
    pnpm: 8.3.0 - ~/.local/share/pnpm/pnpm
  Browsers:
    Chrome: 120.0.6099.109
  npmPackages:
    vite: ^5.0.10 => 5.0.10

Used Package Manager

npm

Logs

Click to expand! ```shell 10:46:44 PM [vite] Internal server error: [vite] The "attributes" property of ModuleInfo is not supported. ```

Validations

stackblitz[bot] commented 11 months ago

Fix this issue in StackBlitz Codeflow Start a new pull request in StackBlitz Codeflow.

Kycermann commented 6 months ago

This is breaking rollup-plugin-import-css-classes when running on Vite.

jantimon commented 3 months ago

I created a package which currently supports only webpack but I would love to add support for Vite too.

Unfortunately I get The "code" property of ModuleInfo is not supported. during vite dev:

https://github.com/vitejs/vite/blob/b240a8347e7b62bee9d2212625732bb0d8c78633/packages/vite/src/node/server/pluginContainer.ts#L214

The information I need is available but only behind a private api (this._container.moduleGraph.idToModuleMap.get(id).transformResult.code)

With Webpack it is possible during dev and build https://webpack.js.org/api/loaders/#thisloadmodule to access the code and attributes of other modules

Is there anything I can do to support adding this feature?

swwind commented 3 months ago

It appears that the return value of this.load differs between serve and build modes.

In serve mode, the moduleInfo object only contains the id and meta properties, as seen in these lines:

https://github.com/vitejs/vite/blob/b240a8347e7b62bee9d2212625732bb0d8c78633/packages/vite/src/node/server/pluginContainer.ts#L200-L201

While we can manually obtain a ModuleNode object using this._container.moduleGraph.getModuleById(id), the transformResult remains null. This suggests that the module might not have been loaded or transformed at all.

In build mode, everything just works as expected.