最近在用pnpm workspace管理项目,把公共样式抽到一个包里,然后在子项目里用@import引用。但不管怎么改路径都报404,比如在子项目的style.css里这样写:
@import '~@/shared/styles/base.css';
报错说找不到文件。之前试过把shared包加到dependencies里,也试过用相对路径../shared/styles/base.css,但构建时还是提示404。是不是需要特殊配置pnpm的path映射?或者package.json里要加什么字段?
~/@/shared/styles/base.css这种写法是vite或webpack的别名处理,JS里面能认,但CSS里的@import不走这些解析规则。正确做法分两步。第一,shared包必须在package.json里定义好入口文件,比如你在packages/shared/package.json加上:
然后把base.css内容导出到index.css里。第二,在子项目安装这个包作为依赖:
pnpm add @shared/styles最后在你的style.css里这样写:
@import '@shared/styles';注意没有波浪线也没有引号包裹路径。如果是用vite,确保css.modules里开启了支持,或者用postcss-import插件。构建工具会自动解析node_modules里的包,不需要手动配路径映射。你之前用相对路径不行是因为workspace的node_modules是扁平化的,不能直接跨包引用内部文件。
我的做法是用 pnpm 的 workspace 协议加上相对路径,同时构建工具也要处理好路径。例如:
如果你的目录结构是这样的:
那你可以这样写 @import:
但如果你的子项目是嵌套更深的结构,比如:
那你需要根据层级写相对路径:
如果构建工具报错,那可能是因为 CSS 文件没有被构建工具处理就直接复制了。你需要确保构建工具(比如 PostCSS 或 Vite)能处理这些 @import 并正确打包。
另外,在 package.json 中你可以添加:
确保 workspace 的路径是正确的。
还有一点,如果使用像 Vite 这样的工具,CSS 中的 ~@/ 语法其实是别名解析,这个需要在 vite.config.js 中配置:
但注意这种别名只在模块导入中有效,CSS 文件中不支持这种别名映射。
总之我的建议是:在 CSS 文件中用相对路径引入,确保构建工具处理好 CSS 文件的打包流程。