Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/corePublic

fix(compiler-vapor): fix asset import from public directory#13630

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
Gianthard-cyh wants to merge6 commits intovuejs:minor
base:minor
Choose a base branch
Loading
fromGianthard-cyh:minor

Conversation

Gianthard-cyh
Copy link

@Gianthard-cyhGianthard-cyh commentedJul 14, 2025
edited
Loading

Problem statement

See#13623.

Change summary

Addimports for TransformContext in compiler-vapor.
Modify expression generator to treat the expression of imported public asset properly.
Generate asset imports.

Closes#13623.

@coderabbitaicoderabbitai
Copy link

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the.coderabbit.yaml file in this repository. To trigger a single review, invoke the@coderabbitai review command.

You can disable this status message by setting thereviews.review_status tofalse in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat withCodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag@coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag@coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on oursupport page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings togenerate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add@coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add@coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add@coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a.coderabbit.yaml file to the root of your repository.
  • Please see theconfiguration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation:# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit ourDocumentation for detailed information on how to use CodeRabbit.
  • Join ourDiscord Community to get help, request features, and share feedback.
  • Follow us onX/Twitter for updates and announcements.

@github-actionsGitHub Actions
Copy link

Size Report

Bundles

FileSizeGzipBrotli
compiler-dom.global.prod.js84.1 kB29.8 kB26.2 kB
runtime-dom.global.prod.js104 kB39.1 kB35.2 kB
vue.global.prod.js162 kB59.3 kB52.8 kB

Usages

NameSizeGzipBrotli
createApp (CAPI only)47.2 kB18.5 kB16.9 kB
createApp56 kB21.6 kB19.7 kB
createApp + vaporInteropPlugin68.5 kB25.8 kB23.6 kB
createVaporApp21 kB8.31 kB7.6 kB
createSSRApp60.3 kB23.4 kB21.3 kB
defineCustomElement61 kB23.1 kB21.1 kB
overall70.5 kB26.8 kB24.5 kB

@pkg-pr-newpkg.pr.new
Copy link

Open in StackBlitz

@vue/compiler-core

npm i https://pkg.pr.new/@vue/compiler-core@13630

@vue/compiler-dom

npm i https://pkg.pr.new/@vue/compiler-dom@13630

@vue/compiler-sfc

npm i https://pkg.pr.new/@vue/compiler-sfc@13630

@vue/compiler-ssr

npm i https://pkg.pr.new/@vue/compiler-ssr@13630

@vue/compiler-vapor

npm i https://pkg.pr.new/@vue/compiler-vapor@13630

@vue/reactivity

npm i https://pkg.pr.new/@vue/reactivity@13630

@vue/runtime-core

npm i https://pkg.pr.new/@vue/runtime-core@13630

@vue/runtime-dom

npm i https://pkg.pr.new/@vue/runtime-dom@13630

@vue/runtime-vapor

npm i https://pkg.pr.new/@vue/runtime-vapor@13630

@vue/server-renderer

npm i https://pkg.pr.new/@vue/server-renderer@13630

@vue/shared

npm i https://pkg.pr.new/@vue/shared@13630

vue

npm i https://pkg.pr.new/vue@13630

@vue/compat

npm i https://pkg.pr.new/@vue/compat@13630

commit:d50620c

@@ -1,5 +1,17 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html

exports[`compile > asset imports > from public directory 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
import _imports_0 from '/vite.svg';
Copy link
Member

@edison1105edison1105Jul 15, 2025
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

import_imports_0from'/vite.svg';constt0=_template(`<img src="${_imports_0}">`,true)

It should be done like this to avoidrenderEffect andsetProp.

ShenQingchuan and Gianthard-cyh reacted with thumbs up emoji
Copy link
Author

@Gianthard-cyhGianthard-cyhJul 15, 2025
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Hi! Thanks for the suggestion — I’ve tried to move_imports_0 into the template string as recommended to avoidrenderEffect andsetProp.

exportfunctiongenTemplates(
templates:string[],
rootIndex:number|undefined,
{ helper}:CodegenContext,
):string{
returntemplates
.map(
(template,i)=>
`const t${i} =${helper('template')}(${JSON.stringify(
template,
)}${i===rootIndex ?', true' :''})\n`,
)
.join('')
}

However, thegenTemplates function still usesJSON.stringify(), which wraps the entire template in double quotes and escapes inner quotes. That prevents me from generating template literals like:

constt0=_template(`<img src="${_imports_0}">`,true)

I also tried string concatenation:

template+=`${key.content}=""+${values[0].content}+""`

But this results in a normal string with escaped quotes.

constt0=_template("<img src=\"\"+_imports_0+\"\">")

Let me know if you have any thoughts or preferred direction on this — happy to collaborate on the final approach!

ShenQingchuan reacted with eyes emoji
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

It should be easier to implement using string concatenation. For example, like this:

  • Wrap the variable with special characters
template+=`${key.content}="$\{${values[0].content}\}$"`
  • In genTemplates, replace the variable with string concatenation
${JSON.stringify(template).replace(/\${_imports_(\d+)}\$/g,'"+ _imports_$1 +"')

@Gianthard-cyh
Copy link
Author

Hi!@edison1105
I've committed a version that replaces JSON.stringify with a custom escape function, and wraps the template strings with backticks (`) instead of double quotes ("). I bundled and tested the output and it successfully fixes the issue.

This change breaks the existing unit tests because previous snapshots were based on template strings wrapped with double quotes. I'm not sure whether this change might break anything else beyond the existing tests, so I’d appreciate your review and feedback before proceeding further.

@@ -262,4 +263,46 @@ describe('compile', () => {
)
})
})

describe('asset imports', () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

A new test file should be created to testassetUrl andsrcset. For example:

  • templateTransformAssetUrl.spec.ts
  • templateTransformSrcset.spec.ts

Try to port the relevant test cases from the existingtemplateTransformAssetUrl.spec.ts andtemplateTransformSrcset.spec.ts.

@ShenQingchuan
Copy link

The current implementation of this PR still has the following issues:

  1. The template string parameter within the generated_template(...) template creation has an incorrect implementation. It converts to_template(``<img src="" + _imports_0 + "" alt="..." >``), which breaks thesrc attribute's value.

  2. Currently,transformNativeElement has a fundamental problem:

interfaceIREffect{// Here, `expressions` was previously considered to only be `SimpleExpressionNode` in its type.expressions:(SimpleExpressionNode|CompoundExpressionNode)[]operations:OperationNode[]}

Therefore, forsrcset's multiple import string variable concatenating operations, it cannot be properly parsed and recognized, leading to it ultimately being classified as a dynamic expression and thus unable to be statically hoisted.

Thus,transformNativeElement needs to categorize and discuss the expression types to determine whether they can be statically hoisted as a whole:

  • simple expression / string / symbol = can be directly hoisted
  • compound expression = recursive judgment
  • interpolation expression = judge whether the interpolated expression can be hoisted
Gianthard-cyh reacted with thumbs up emoji

@Gianthard-cyh
Copy link
Author

Thanks for your response@ShenQingchuan! I’ve also encountered this with assetURLs. SinceIRProp is currently typed to only acceptSimpleExpressionNode:

exportinterfaceIRPropextendsOmit<DirectiveTransformResult,'value'>{values:SimpleExpressionNode[]}

…it becomes tricky to support cases like:

<usehref="~@svg/file.svg#fragment"></use>

In this case, the prop value is actually_imports_0 + '#fragment', but it’s wrapped as a singleSimpleExpressionNode, even though it’s clearly a compound expression. This makes it difficult to correctly extract or manipulate the individual parts, especially for asset URL resolution.

I’m currently trying to work around this, though it’s a bit challenging for me.

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@edison1105edison1105Awaiting requested review from edison1105

Assignees
No one assigned
Labels
Projects
Status: Vapor
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

[Vapor] Using image from public directory causes error
3 participants
@Gianthard-cyh@ShenQingchuan@edison1105

[8]ページ先頭

©2009-2025 Movatter.jp