carbon / pipeline
基于 esbuild 和 PostCSS 的 Neos CMS 超快构建栈
- dev-main
- 0.15.4
- 0.15.3
- 0.15.2
- 0.15.1
- 0.15.0
- 0.14.0
- 0.13.3
- 0.13.2
- 0.13.1
- 0.13.0
- 0.12.3
- 0.12.2
- 0.12.1
- 0.12.0
- 0.11.5
- 0.11.4
- 0.11.3
- 0.11.2
- 0.11.1
- 0.11.0
- 0.10.15
- 0.10.14
- 0.10.13
- 0.10.12
- 0.10.11
- 0.10.10
- 0.10.9
- 0.10.8
- 0.10.7
- 0.10.6
- 0.10.5
- 0.10.4
- 0.10.3
- 0.10.2
- 0.10.1
- 0.10.0
- 0.9.6
- 0.9.5
- 0.9.4
- 0.9.3
- 0.9.2
- 0.9.1
- 0.9.0
- 0.8.10
- 0.8.9
- 0.8.8
- 0.8.7
- 0.8.6
- 0.8.5
- 0.8.4
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8.0
- 0.7.8
- 0.7.7
- 0.7.6
- 0.7.5
- 0.7.4
- 0.7.3
- 0.7.2
- 0.7.1
- 0.7.0
- 0.6.6
- 0.6.5
- 0.6.4
- 0.6.3
- 0.6.2
- 0.6.1
- 0.6.0
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.0
- 0.1.0
- dev-dependabot/github_actions/actions/setup-node-4.0.4
This package is auto-updated.
Last update: 2024-09-23 10:25:04 UTC
README
Carbon.Pipeline 是 esbuild 和 PostCSS 的美味融合,形成一个功能齐全、超快的现代 JavaScript 和 CSS 打包器,用于 Flow 框架和 Neos CMS。
入门指南
首先,感谢您想尝试这个构建栈!如果您错过了一个✨功能或发现了一个🐛错误,请随时 提交问题。
通过 composer 安装
运行 composer require carbon/pipeline --dev
。在安装过程中,某些文件(如果尚未存在)将被复制到您的根目录。安装包后,运行命令 install
安装 package.json
中定义的所需包。在安装前,您可以根据需要修改和更改依赖项 👍
在不使用 Neos 的情况下在自定义项目中独立使用
Carbon.Pipeline 也可以是您非 Neos 项目的完美选择。请考虑事先安装 composer 包 neos/composer-plugin
,以便将 Carbon.Pipeline 安装在 Build/Carbon.Pipeline
下的正确目录。
手动安装
如果您想对构建栈进行重大调整,您还可以 下载代码的 zip 文件 并将其放入 Build/Carbon.Pipeline
文件夹中。转到 Carbon.Pipeline/RootFiles/Global
和 Carbon.Pipeline/RootFiles/JavaScript
或 Carbon.Pipeline/RootFiles/TypeScript
,将文件复制到您的根目录(不要忘记以点开头的隐藏文件)。完成后,运行命令 install
安装 package.json
中定义的所需包。在安装前,您可以根据需要修改和更改依赖项 👍
选择包管理器
您可以选择不同的包管理器: npm、Yarn 和超快且节省磁盘空间的 pnpm。您可以通过运行命令 pnpm setPackageManager
、npm run setPackageManager npm
或 yarn setPackageManager yarn
来设置您喜欢的包管理器。脚本不需要任何依赖项,因此您可以在 install
命令之前运行它。默认包管理器为 pnpm
将文件添加到构建栈
Carbon.Pipeline 假定以下项目目录结构用于资源
在以下配置位置下:
Resources/Private
:输入文件Resources/
:输出文件
整个配置,包括要构建哪些文件,都在 pipeline.yaml
中配置。默认值在 defaults.yaml
中设置,并与您的配置合并。在 packages
键下,您可以添加包含包设置的数组,或者如果您只有一个条目,可以直接添加配置
packages: - package: Vendor.Bar files: - Main.pcss - Main.js # This is the same as packages: package: Vendor.Bar files: - Main.pcss - Main.js
如果您只有一个文件,可以直接传递,无需创建数组
packages: package: Vendor.Bar files: Main.js
如果您没有设置文件,则从输入文件夹中获取所有可解析的文件进行渲染。以下划线 (_
) 开头的文件将被忽略。
packages: package: Vendor.Bar
要更改输入和/或输出文件夹,可以使用 folder
选项
packages: package: Vendor.Bar folder: input: Assets output: inline: Private/Templates style: Public script: Public module: Public commonJS: Public
此外,您可以将文件写入另一个包
packages: package: Vendor.Bar folder: output: package: Vendor.Theme
如果您想在 Neos 中玩转多站点,也可以将文件写入多个包
packages: package: Vendor.Bar folder: output: package: - Vendor.Theme - Vendor.Bar
包条目有以下选项
以下是文件夹的默认值
folder: input: Fusion output: inline: Private/Templates/InlineAssets style: Public/Styles script: Public/Scripts module: Public/Modules commonJS: Public/CommonJS
以下是构建选项的默认值
external: null inline: false sourcemap: true format: iife jsFileExtension: script: .js module: .mjs commonJS: .cjs
可以在 folder.output
键下调整目标文件夹。如果您想为所有包更改默认值,也可以在您的 pipeline.yaml
中全局设置
folder: input: Assets output: inline: Private/Templates style: Public script: Public module: Public commonJS: Public buildDefaults: sourcemap: false format: esm
请参阅 defaults.yaml
文件以获取所有选项。
如果您设置了带有 JavaScript 模块后缀的条目文件(.mjs
、.mjsx
、.mts
或 .mtsx
),则此文件的格式将强制为 esm
。与 commonJS 相同:如果您设置了带有 JavaScript commonJS 后缀的条目文件(.cjs
、.cjsx
、.cts
或 .ctsx
),则此文件的格式将强制为 cjs
。例如,如果您有以下数组 ["Main.js", "Module.mjs", "CommonJS.cjs"]
,并且没有特定的格式设置,则 Main.js
的格式将为 iife
,Module.mjs
的格式将为 esm
,而 CommonJS.cjs
的格式将为 cjs
。
任务
由于您可以选择您喜欢的包管理器,因此您必须将任务名称与相应的名称(pnpm
、yarn
或 npm run
)一起使用
有五个预定义的主要任务
任务被分割,因此它们可以并行运行。但是,您也可以单独运行它们
可扩展性
当然,您也可以在您的 package.json
文件的 scripts
部分添加自己的任务。例如,如果您有 Neos UI 自定义编辑器并且想在同一个地方启动所有任务,您可以这样添加它们
{ "build:editor": "pnpm --dir DistributionPackages/Foo.Editor/Resources/Private/Editor/ build", "watch:editor": "pnpm --dir DistributionPackages/Foo.Editor/Resources/Private/Editor/ watch", "pipeline:editor": "pnpm --dir DistributionPackages/Foo.Editor/Resources/Private/Editor/ install", }
请注意,根据所选的任务管理器,设置选项的语法可能不同。例如,要设置当前工作目录,对于
yarn
,您必须设置--cwd
,对于pnpm
,设置--dir
或-C
,对于npm
,设置--prefix
。
由于任务以 build:
、分别以 watch:
或 pipeline:
开头,因此任务将包含在相应的根命令中。在这个例子中,build
、watch
或 pipeline
。如果您想玩得更疯狂,甚至可以混合不同的任务管理器。
文件压缩
在生产模式(build
)下,文件也会使用 gzip 和 brotli 进行压缩。您可以在 buildDefaults.compression
键下编辑压缩级别。默认情况下,设置为最高压缩级别。要完全禁用压缩,您可以将其设置为 false
buildDefaults: compression: false
或者,如果您只想禁用其中一个,可以将条目设置为 false
buildDefaults: compression: gzip: false
从 DistributionPackages 和其他 Packages 导入文件
默认情况下,已预定义了两个别名:DistributionPackages
和 Packages
。这样您就可以导入(CSS 和 JS)文件,如下所示从其他包中
import "DistributionPackages/Vendor.Foo/Resources/Private/Fusion/Main"; import "Packages/Plugins/Jonnitto.PhotoSwipe/Resources/Private/Assets/PhotoSwipe";
@import "DistributionPackages/Vendor.Foo/Resources/Private/Fusion/Main.pcss"; @import "Packages/Carbon/Carbon.Image/Resources/Private/Assets/Tailwind.pcss";
感谢自定义的 resolve
函数,您还可以在 CSS 导入中使用 globbing: @import "Presentation/**/*.pcss";
修改配置文件
在某些设置中,您可能需要使用不同的配置文件进行多个配置。在这种情况下,您可以在 package.json
文件中的 scripts
部分设置其他配置文件
{ "build:custom:css": "node Build/Carbon.Pipeline/postcss.mjs --configFile=pipelineCustom.yaml" }
在这个示例中,使用的是 pipelineCustom.yaml
而不是 pipeline.yaml
。
CSS
Sass
如果您想使用 Sass(.scss
或 .sass
文件),则必须安装 sass
和 node-sass-tilde-importer
对于 pnpm
pnpm add -D sass node-sass-tilde-importer
对于 Yarn
yarn add --dev sass node-sass-tilde-importer
对于 npm
npm add -D sass node-sass-tilde-importer
有两种方法可以从 node_modules
中导入文件(以 bootstrap 为例)
@import "node_modules/bootstrap/scss/bootstrap"; @import "~bootstrap/scss/bootstrap";
传递选项给 Sass 编译器
您可以通过 sassOptions
传递选项给 Sass 编译器。
示例:为了静默通过导入器和加载路径加载的样式表的警告,您可以启用 quietDeps
sassOptions: quietDeps: true
PostCSS
此模板附带各种 PostCSS 插件。您可以根据需要删除一些或添加您喜欢的包。配置位于 .postcssrc.mjs
。这些文件的扩展名应该是 .pcss
。
将自定义选项传递给您的 PostCSS 配置文件
您可以通过 postcssOptions
键将自定义选项传递给您的 PostCSS 配置文件。在这个例子中,您可以在您的 PostCSS 配置文件(.postcssrc.mjs
)中使用 ctx.prefix
访问 prefix
键。
postcssOptions: prefix: true
使用 postcss resolve() 函数
您可以在 css/scss 文件中使用 resolve()
来从包的 Resources/Public
加载资源(例如图像)。路径将在编译时解析。
.my-class { background-image: resolve('Images/my-image.jpg') }
解析为
.my-class { background-image: url('/_Resources/Static/Packages/Your.Package/Images/my-image.jpg') }
如果您选择将您的 Packages 按照子文件夹排序在 DistributionPackages 中,您可以添加此设置以确保路径被正确重写
postcssOptions: additionalPackagePathPrefixes: - Sites - Plugins
这确保了生成的路径(例如 /_Resources/Static/Packages/(Sites|Plugins)/Your.Package/.../
)将被正确解析,从路径中删除子文件夹。
PostCSS 插件
以下插件包括
当然,您可以根据需要添加自己的或删除不必要的插件。这只是一个起点。
Tailwind CSS
此设置附带 Tailwind CSS,这是一个高度可定制的、低级别的 CSS 框架。示例配置位于 tailwind.config.mjs
。CSS 文件清理的设置也已配置。有关控制文件大小的更多信息,请参阅 此处。由于 CSS 打包是通过 PostCSS 的 JavaScript API 完成的,因此 Tailwind CSS 的 即时模式 运行得非常好。要删除特定包,您可以在 pipeline.yaml
中使用此模式
buildDefaults: purge: - DistributionPackages/**/(Private|NodeTypes)/**/*.{fusion,html,js,jsx,ts,tsx,mjs,mjsx,mts,mtsx,cjs,cjsx,cts,ctsx,svelte,vue} - "!DistributionPackages/Package.ToRemove"
顺便说一句:将 Alpine.js 与 Tailwind CSS 结合使用效果极佳。
JavaScript
JavaScript 中的 Flow 设置
假设您使用类似 Flownative.Sentry 的工具,您可能希望在标记中某处不设置 data
属性的情况下将一些设置传递到您的 JavaScript 中。为此,您可以启用 esbuild.defineFlowSettings
。如果设置为 true
,则所有设置都会传递。建议将其放置在路径中(例如,Flownative.Sentry
)。此路径作为 --path
属性添加到 flow configuration:show
命令中。如果您运行 build
命令,该命令自动具有 --production
标志,则 FLOW_CONTEXT
将设置为 Production
。
esbuild: defineFlowSettings: Flownative.Sentry
在 JavaScript 中,您可以通过这种方式访问变量
Sentry.init({ dsn: FLOW.Flownative.Sentry.dsn, release: FLOW.Flownative.Sentry.release, environment: FLOW.Flownative.Sentry.environment, integrations: [new Integrations.BrowserTracing()], });
请确保您的 eslint.config.mjs
中启用了全局的 FLOW
import globals from "globals"; import pluginJs from "@eslint/js"; import prettierRecommended from "eslint-plugin-prettier/recommended"; export default [ pluginJs.configs.recommended, prettierRecommended, { ignores: ["Build/", "Packages/", "**/Public/", "**/Resources/Private/Templates/", "*.noLinter.*"], languageOptions: { globals: { ...globals.browser, ...globals.node, FLOW: "readonly", }, }, }, ];
传递选项给 esbuild
您可以使用 esbuild.options
将选项传递给 esbuild API。
示例:要从生产构建中删除一些函数,您可以使用 esbuild.options.pure
设置。如果您只有一个函数,则可以传递一个字符串;否则,您必须将其设置为数组
esbuild: options: pure: - console.log - console.pure
TypeScript
如果您想使用 TypeScript,只需在 composer 安装时选择 TypeScript 选项即可
React
通常,使用 JSX 语法需要您手动导入正在使用的 JSX 库。例如,如果您正在使用 React,默认情况下,您需要像这样在每个 JSX 文件中导入 React
import * as React from "react"; render(<div />);
Preact
如果您正在使用除了 React 以外的库(如 Preact),则可能需要配置 JSX 工厂 和 JSX 片段 设置,因为它们默认为 React.createElement
和 React.Fragment
。将以下内容添加到您的 tsconfig.json
或 jsconfig.json
{ "compilerOptions": { "jsxFactory": "h", "jsxFragmentFactory": "Fragment" } }
Svelte
如果您想使用 Svelte,请将以下包添加到 package.json
对于 pnpm
pnpm add -D svelte svelte-preprocess esbuild-svelte @tsconfig/svelte
对于 Yarn
yarn add --dev svelte svelte-preprocess esbuild-svelte @tsconfig/svelte
对于 npm
npm add -D svelte svelte-preprocess esbuild-svelte @tsconfig/svelte
在您的 pipeline.yaml
文件中启用插件
esbuild: plugins: svelte: enable: true # Name of the esbuild plugin for svelte # plugin: esbuild-svelte # Name of the preprocess plugin # preprocess: svelte-preprocess # Add here your options options: compilerOptions: css: true
您还可以配置要使用的 esbuild 插件和预处理包。只需添加键
plugin
或preprocess
和插件名称。
您的 tsconfig.json
可能如下所示
{ "extends": "@tsconfig/svelte/tsconfig.json", "include": ["DistributionPackages/**/Private/*"], "exclude": [ "node_modules/*", "__sapper__/*", "DistributionPackages/**/Public/*", "DistributionPackages/**/Private/Templates/InlineAssets*", "Packages" ], "compilerOptions": { "baseUrl": "./", "paths": { "Packages/*": ["Packages/*"], "DistributionPackages/*": ["DistributionPackages/*"] } } }
Vue.js
如果您想使用 Vue.js,请将以下包添加到 package.json
对于 pnpm
pnpm add -D vue esbuild-plugin-vue3
对于 Yarn
yarn add --dev vue esbuild-plugin-vue3
对于 npm
npm add -D vue esbuild-plugin-vue3
在您的 pipeline.yaml
文件中启用插件
esbuild: plugins: vue: enable: true # Name of the esbuild plugin for Vue # plugin: esbuild-plugin-vue3 # You can pass your needed options here # options:
您还可以配置要使用的 esbuild 插件。只需添加键
plugin
并添加插件名称。
Babel.js / IE 11 支持
如果您想使用 Babel.js,请将以下包添加到 package.json
对于 pnpm
pnpm add -D @babel/core esbuild-plugin-babel
对于 Yarn
yarn add --dev @babel/core esbuild-plugin-babel
对于 npm
npm add -D @babel/core esbuild-plugin-babel
以及添加额外的 Babel 插件和/或预设,如 @babel/preset-env
、@babel/plugin-proposal-class-properties
、@babel/plugin-proposal-object-rest-spread
此外,您必须添加一个名为 babel.config.json
的文件,例如
{ "presets": [ [ "@babel/preset-env", { "modules": false } ] ], "plugins": ["@babel/proposal-class-properties", "@babel/proposal-object-rest-spread"] }
最后,在您的 pipeline.yaml
文件中启用插件
esbuild: plugins: babel: enable: true # You can pass your needed options here # options:
当将ENV
变量设置为development
或production
时,如果您运行任务,您可以有不同的配置(例如,在production
上使用babel-plugin-transform-remove-console
删除console
命令)
{ "env": { "development": { "presets": [ [ "@babel/preset-env", { "modules": false } ] ], "plugins": ["@babel/proposal-class-properties", "@babel/proposal-object-rest-spread"] }, "production": { "presets": [ [ "@babel/preset-env", { "modules": false } ] ], "plugins": ["@babel/proposal-class-properties", "@babel/proposal-object-rest-spread", "transform-remove-console"] } } }
如果您是穷人并且必须支持Internet Explorer,您必须编辑您的.browserslistrc
。如果找到以ie
开头的浏览器,则激活目标es5
。
defaults
ie 11
not dead
额外的esbuild插件
您还可以添加额外的esbuild插件,例如esbuild-envfile-plugin
esbuild: additionalPlugins: esbuild-envfile-plugin: functionName: setup options: null
由于插件不是直接返回函数(像其他插件一样),您还必须传递函数的名称。如果插件直接返回函数,则不需要设置此选项。如果您想不设置任何选项就启用此类插件,只需传递name-of-the-plugin: true
实时重新加载
如果您想使用实时重新加载,可以使用Browsersync。
要安装它,请运行pnpm add --global browser-sync
,yarn global add browser-sync
或npm install -g browser-sync
。
然后您必须使用browser-sync init
创建一个初始配置。之后,您需要调整创建的bs-config.js
文件。您可以调整每个参数,但您需要设置的参数是files
和proxy
module.exports = { files: ["DistributionPackages/**/Public/**/*.css", "DistributionPackages/**/Public/**/*.js"], proxy: "http://your.local.domain", };
如果您还想在更改fusion
或模板文件时重新加载页面,您也可以这样做
module.exports = { files: [ "DistributionPackages/**/Public/**/*.css", "DistributionPackages/**/Public/**/*.js", "DistributionPackages/**/Private/**/*.fusion", "DistributionPackages/**/Private/**/*.html", ], proxy: "http://your.local.domain", };
请确保您设置了正确的代理,并使用相应的协议(https://
或http://
),具体取决于您的配置。为了更好地了解参数,您可以从文件中删除未更改的值。
要启动Browsersync,您可以运行browser-sync start --config bs-config.js
。如果您想与watch
一起启动,可以将以下行添加到scripts
部分
{ "watch:browsersync": "browser-sync start --config bs-config.js", }