VS Code中ES6导入压缩/未压缩JS文件的智能提示问题
问题背景
我的Firebase托管项目文件夹结构如下:
projectFolder/store/public/scripts/*.min.js projectFolder/src/*.js
运行terser后,projectFolder/src/*.js会被压缩至projectFolder/store/public/scripts/*.min.js,我的terser脚本如下:
call terser src/site-ui-components.js -o store/public/scripts/site-ui-components.min.js -c -m echo site-ui-components.min.js: Done. call terser src/login.js -o store/public/scripts/login.min.js -c -m echo login.min.js: Done. call terser src/register.js -o store/public/scripts/register.min.js -c -m echo register.min.js: Done. call terser src/profile.js -o store/public/scripts/profile.min.js -c -m echo profile.min.js: Done.
使用ES6导入时遇到两难情况:
- 写
import { something1, something2 } from "/scripts/something.min.js";:运行正常,但VS Code中丢失something1和something2的智能提示 - 写
import { something1, something2 } from "./something.js";:能启用智能提示,但运行时因找不到文件报错
不想给所有未压缩JS添加*.min.js后缀,也不想用动态导入写额外适配代码,现咨询:
- 如何在不破坏运行的前提下保留ES6导入的智能提示?
- 当前文件夹结构是否不符合最佳实践?有何优化建议?
- 是否应将压缩与未压缩文件统一命名为
*.js?
解决方案
1. 保留智能提示且不影响运行的方法
用VS Code的jsconfig.json(或tsconfig.json,不用TypeScript也能生效)配置路径映射,让编辑器自动关联导入路径和源文件。
在项目根目录创建jsconfig.json,内容如下:
{ "compilerOptions": { "baseUrl": ".", "paths": { "/scripts/*.min.js": ["src/*.js"] } }, "include": ["src/**/*.js"] }
配置后,写import { something1, something2 } from "/scripts/something.min.js";时,VS Code会自动映射到src/something.js获取类型提示,而运行时依然加载压缩后的.min.js文件,完全不用修改导入语句。
2. 文件夹结构优化建议
当前结构有可优化空间,调整后更符合前端项目最佳实践:
- 简化层级:Firebase托管的静态资源目录建议直接用
public,而非嵌套在store下,减少路径复杂度,比如把构建输出目录设为public/scripts。 - 批量处理压缩脚本:不用逐个文件写terser命令,改成批量处理更高效,比如用Windows批处理的循环:
for %%f in (src\*.js) do ( terser "%%f" -o "public/scripts/%%~nf.min.js" -c -m echo %%~nf.min.js: Done. )
新增源文件时不用手动追加命令,自动处理所有src下的JS文件。
- 明确源码与产物分离:保持
src(源码)和public(构建产物)同级,Firebase直接托管public目录,结构更清晰,避免混淆。
3. 是否统一命名为*.js?
不建议统一命名,原因如下:
- 容易混淆源码与产物:统一命名后,开发时可能误修改压缩后的产物文件,重新构建后会被覆盖,造成不必要的工作损失。
- 后缀区分更直观:
.min.js能明确标识生产环境的压缩文件,调试时可快速切换到未压缩的源码文件(即使浏览器能反混淆压缩文件,后缀区分仍更便捷)。 - 路径映射已解决智能提示问题:前面的
jsconfig.json配置已经搞定了提示问题,没必要为了统一命名牺牲文件的辨识度。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

