【问题标题】:Include CSS (Sass) from multiple modules包含来自多个模块的 CSS (Sass)
【发布时间】:2015-12-27 11:55:19
【问题描述】:

我正在整理一个将在 npm 上可用的 repo。 repo 由多个模块组成,类似于react-leafletreact-d3。应用程序开发人员将通过require/import 将模块包含在 npm 包中,例如:

import { ModuleOne, ModuleTwo } from 'myNpmPackage`;

我需要将 CSS 与每个模块一起打包,并且 CSS 将从每个模块中的 Sass 文件编译。

给定myNpmPackage 的文件夹结构,例如:

├── src
│   ├── ModuleOne
│   │   ├── index.js
│   │   ├── style.scss
│   ├── ModuleTwo
│   │   ├── index.js
│   │   ├── style.scss
├── package.json

有什么好的发布流程可以让myNpmPackage 的消费者可以使用这些.scss 文件(编译成.css),而不要求消费者明确包含/@import/link rel="stylesheet" CSS?

我正在使用 gulpbrowserify,并且更愿意坚持使用该管道。


更新:我发现 parcelify 做了我需要的一些。我将以下内容添加到myNpmPackage/package.json

"style": "src/**/*.scss",
"transforms": [
  "sass-css-stream"
]

并将parcelify 添加到dependencies,使其与myNpmPackage 一起安装。

myNpmPackage 的消费者必须将以下内容添加到他们的gulpfile

parcelify(b, {
    bundles: {
        style: './build/modules.css'
    }
});

parcelify 将使用myNpmPackage/package.json 中的"style" glob 将.scss 模块中的所有.scss 文件汇总到myNpmPackage 的模块中,并将它们捆绑到./build/modules.css 中。

这已经到了那里,但由于两个原因并不理想:

  1. 每个模块的 CSS 文件都包含在消费者应用程序构建中,即使不是所有模块都包含在内;
  2. 此策略要求消费者应用程序开发人员将代码添加到他们的gulpfile,而不是“正常工作”。

【问题讨论】:

  • 我知道你想坚持使用 browserify 但webpack 实际上非常适合你的用例
  • @JulienCabanès 你介意详细说明一下吗?也许你比我更熟悉 webpack,并且可以分享一个我如何使用 webpack 做到这一点的示例。

标签: javascript sass npm gulp browserify


【解决方案1】:

Here is a Webpack setup 正是您所需要的:

  • the build 中仅包含导入的模块 CSS(例如,ModuleThree 不包含)。
  • 无需像任何其他依赖项一样更新一些gulpfile.js*.config.js,每个模块require its own stylesheet(s)

奖励:ModuleTwo 显示 how to lazy load CSS 并且还包含一个背景图像,它也将像任何依赖项一样包含在内。

注意:我没有使用 ES2015 语法,但您可以使用 babel-loader

【讨论】:

  • 感谢@Julien,这太棒了。我将继续接受这个答案,因为我还不想从 browserify 切换到 webpack ......但我可能很快就会改变主意:)
  • 我意识到我可能是一个纯粹主义者,但我不喜欢将 CSS 内嵌到 HTML 中。 webpack 是否提供将所需的 CSS/Sass 文件编译为 .css 文件而不是内联的选项?
  • 是的,this plugin。我有updated 我的配置,现在我有一个build stylesheet(延迟加载除外),我必须使用经典的link 标签来include manually
【解决方案2】:

这部分取决于您自己的开发管道。您可以在构建应用程序时将所有 SCSS 渲染为 CSS。因此,假设您有一个包含所有样式的 CSS 文件,您可以使用 gulp 生态系统中的各种方法将其包含到 JavaScript 文件中,例如 this plugin

function addStyleString(str) {
    var node = document.createElement('style');
    node.innerHTML = str;
    document.body.appendChild(node);
}

addStyleString('/* CSS File 1 */');

在你的 gulp 管道中:

var gfi = require("gulp-file-insert");

gulp.src('./sample.js')
  .pipe(gfi({
    "/* CSS File 1 */": "path/to/main.css"
  }))
  .pipe(gulp.dest('./dist/'));

参考:Inject CSS stylesheet as string using Javascript

【讨论】:

  • 不确定我对整个 CSS-inlined-into-JS 的感觉是否很好,就像 Radium。不过谢谢你的建议。
猜你喜欢
  • 2014-04-13
  • 1970-01-01
  • 2023-02-20
  • 2018-07-24
  • 2021-05-11
  • 2017-12-19
  • 2016-12-13
  • 2012-06-16
  • 2018-06-24
相关资源
最近更新 更多