如果将Tailwind结合Blazor。

Adding Tailwind CSS v3 to a Blazor app

总的来说,并没有啥特别之处啊。

Use Tailwind’s new JIT mode when developing Blazor applications

Using Tailwind CSS v3.1 with Blazor (.Net 6)

  • Setup with using Standalone Tailwind CSS CLI without Node.js
    • 这里用到的是独立版的CLI
    • 在工程中创建一个StaticAssets,用于保存tailwind的配置,style.css以及tailwind.config.js
      • 配置中还包括一个TailwindCli.targets,要加入到.csproj中: <Import Project="StaticAssets\TailwindCli.targets" />
    • 依照具体情况,把style.css添加到Pages/_Layout.cshtmlwwwroot/index.html
    • 生成css的命令是:cd {ProjectDirectory}/StaticAssets/ && tailwindcss -i styles.css -o {ProjectDirectory}/wwwroot/css/styles.css -w
  • Setup with using Node.js and npm
    • 针对NPM版Tailwind CLI的配置
    • 生成css的命令是:cd {ProjectDirectory}/StaticAssets/ && npx --no-install tailwindcss -i styles.css -o {ProjectDirectory}/wwwroot/css/styles.css -w

具体的配置:

Blazor.csproj

	<!-- If you are using Node.js with npm -->
  <Import Project="StaticAssets\TailwindNpm.targets" />

	<!-- If you are using Standalone Tailwind CSS CLI -->
  <Import Project="StaticAssets\TailwindCli.targets" />

tailwind.config.js

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    '../{Pages,Shared}/**/*.{cshtml,razor,cs,css}'
  ],
  theme: {
    extend: {},
  },
  plugins: [
  ]
}

TailwindCli.targets

<Project>
  <ItemGroup>
    <AvailableItemName Include="TailwindCli" />
  </ItemGroup>

  <ItemGroup>
    <Content Update="StaticAssets/*" CopyToPublishDirectory="Never" />
  </ItemGroup>

  <Target Name="CheckIfTailwindCssIsInstalled">
    <PropertyGroup>
      <TailwindCssTestCommand Condition="$(OS) == Windows_NT">tailwindcss -h &gt; NUL</TailwindCssTestCommand>
      <TailwindCssTestCommand Condition="$(OS) != Windows_NT">tailwindcss -h &gt; /dev/null</TailwindCssTestCommand>
    </PropertyGroup>

    <Exec Command="$(TailwindCssTestCommand)" IgnoreExitCode="true" EchoOff="true">
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>

    <Error Text="Tailwind CSS is required to build and run this project. To continue, please install Tailwind CSS from https://github.com/tailwindlabs/tailwindcss/releases/latest, and then restart your command prompt or IDE." Condition="$(ExitCode) != 0" />
  </Target>

  <Target Name="ProcessScopedCssFiles" AfterTargets="_GenerateScopedCssFiles">
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="CurrentScopedCssFile=%(_ScopedCssOutputs.Identity)" Targets="PostScopedCssCompile"></MSBuild>
  </Target>

  <Target Name="PostScopedCssCompile" AfterTargets="ProcessScopedCssFiles" DependsOnTargets="CheckIfTailwindCssIsInstalled" Condition="$(CurrentScopedCssFile) != ''">
    <Message Importance="high" Text="Building scoped css..." />

    <Exec Command="tailwindcss -i $(CurrentScopedCssFile) -o $(CurrentScopedCssFile) -c ./tailwind.config.js" IgnoreExitCode="true" EchoOff="true" WorkingDirectory="$(MSBuildThisFileDirectory)">
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>

    <Error Text="Error via build scoped css" Condition="$(ExitCode) != 0" />
  </Target>

  <Target Name="BuildCss" BeforeTargets="CoreBuild" DependsOnTargets="PostScopedCssCompile" Outputs="$(MSBuildProjectDirectory)/wwwroot/css/styles.css">
    <Message Text="Starting tailwindcss. This may take a while..." />

    <Exec Command="tailwindcss -i styles.css -o $(MSBuildProjectDirectory)/wwwroot/css/styles.css -m" IgnoreExitCode="true" EchoOff="true" WorkingDirectory="$(MSBuildThisFileDirectory)" EnvironmentVariables="NODE_ENV=production">
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>

    <Error Text="Error via build css" Condition="$(ExitCode) != 0" />
  </Target>

  <Target Name="PostStylesCssCompile" AfterTargets="Build">
    <Message Importance="high" Text="Run this command if you are in the watch mode" />
    <Message Importance="high" Text="cd $(MSBuildThisFileDirectory) &amp;&amp; tailwindcss -i styles.css -o $(MSBuildProjectDirectory)/wwwroot/css/styles.css -w" />
  </Target>
</Project>

TailwindNpm.targets

<Project>
  <ItemGroup>
    <AvailableItemName Include="TailwindNpm" />
  </ItemGroup>

  <ItemGroup>
    <Content Update="StaticAssets/*" CopyToPublishDirectory="Never" />
  </ItemGroup>

  <Target Name="CheckIfNodeJSIsInstalled">
    <PropertyGroup>
      <NodeTestCommand Condition="$(OS) == Windows_NT">node -v &gt; NUL</NodeTestCommand>
      <NodeTestCommand Condition="$(OS) != Windows_NT">node -v &gt; /dev/null</NodeTestCommand>
    </PropertyGroup>

    <Exec Command="$(NodeTestCommand)" IgnoreExitCode="true" EchoOff="true">
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>

    <Error Text="Node.js is required to build and run this project. To continue, please install Node.js from https://nodejs.org/, and then restart your command prompt or IDE." Condition="$(ExitCode) != 0" />
  </Target>

  <Target Name="NpmInstall" DependsOnTargets="CheckIfNodeJSIsInstalled" Condition="!Exists('$(MSBuildThisFileDirectory)package-lock.json')">
    <!-- If package-lock.json does not exists, perform an NPM install -->
    <Message Importance="high" Text="Restoring dependencies using 'npm'. This may take several minutes..." />
    <Exec Command="npm i" WorkingDirectory="$(MSBuildThisFileDirectory)" />
    <Copy SourceFiles="$(MSBuildThisFileDirectory)package-lock.json" DestinationFolder="$(BaseIntermediateOutputPath)" SkipUnchangedFiles="true" />
  </Target>

  <Target Name="NodeModulesInstall" DependsOnTargets="NpmInstall" Condition="!Exists('$(MSBuildThisFileDirectory)node_modules')">
    <!-- If node_modules does not exists, perform an NPM clean install -->
    <Message Importance="high" Text="Restoring node_modules using 'npm'. This may take several minutes..." />
    <Exec Command="npm ci --also=dev" WorkingDirectory="$(MSBuildThisFileDirectory)" />
    <Copy SourceFiles="$(MSBuildThisFileDirectory)package-lock.json" DestinationFolder="$(BaseIntermediateOutputPath)" SkipUnchangedFiles="true" />
  </Target>

  <Target Name="NpmCleanInstall" DependsOnTargets="NodeModulesInstall" Inputs="$(MSBuildThisFileDirectory)package-lock.json" Outputs="$(BaseIntermediateOutputPath)package-lock.json">
    <!-- If package-lock.json has changed, perform an NPM clean install -->
    <Message Importance="high" Text="Restoring dependencies using 'npm'. This may take several minutes..." />
    <Exec Command="npm ci --also=dev" WorkingDirectory="$(MSBuildThisFileDirectory)" />
    <Copy SourceFiles="$(MSBuildThisFileDirectory)package-lock.json" DestinationFolder="$(BaseIntermediateOutputPath)" SkipUnchangedFiles="true" />
  </Target>

  <Target Name="ProcessScopedCssFiles" AfterTargets="_GenerateScopedCssFiles">
    <MSBuild Projects="$(MSBuildProjectFile)"
             Properties="CurrentScopedCssFile=%(_ScopedCssOutputs.Identity)"
             Targets="PostScopedCssCompile">
    </MSBuild>
  </Target>

  <Target Name="PostScopedCssCompile" AfterTargets="ProcessScopedCssFiles" DependsOnTargets="NpmCleanInstall" Condition="$(CurrentScopedCssFile) != ''">
    <Message Importance="high" Text="Building scoped css..." />

    <Exec Command="npx --no-install tailwindcss -i $(CurrentScopedCssFile) -o $(CurrentScopedCssFile) -c ./tailwind.config.js"
          IgnoreExitCode="true"
          EchoOff="true"
          WorkingDirectory="$(MSBuildThisFileDirectory)">
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>

    <Error Text="Error via build scoped css" Condition="$(ExitCode) != 0" />
  </Target>

  <Target Name="BuildCss" BeforeTargets="CoreBuild" DependsOnTargets="PostScopedCssCompile" Outputs="$(MSBuildProjectDirectory)/wwwroot/css/styles.css">
    <Message Text="Starting tailwindcss. This may take a while..." />
		<Message Importance="high" Text="npx --no-install tailwindcss -i styles.css -o $(MSBuildProjectDirectory)/wwwroot/css/styles.css -m" />
    
    <Exec Command="npx --no-install tailwindcss -i styles.css -o $(MSBuildProjectDirectory)/wwwroot/css/styles.css -m"
          IgnoreExitCode="true"
          EchoOff="true"
          WorkingDirectory="$(MSBuildThisFileDirectory)"
          EnvironmentVariables="NODE_ENV=production">
      <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
    </Exec>

    <Error Text="Error via build css" Condition="$(ExitCode) != 0" />
  </Target>

  <Target Name="PostStylesCssCompile" AfterTargets="Build">
    <Message Importance="high" Text="Run this command if you are in the watch mode" />
    <Message Importance="high" Text="cd $(MSBuildThisFileDirectory) &amp;&amp; npx --no-install tailwindcss -i styles.css -o $(MSBuildProjectDirectory)/wwwroot/css/styles.css -w" />
  </Target>
</Project>

Using Tailwind CSS in Blazor just got much easier. I created this sample app and guide to make it even easier for Blazor developers.

项目主页:https://github.com/tesar-tech/BlazorAndTailwind

其他

VS扩展

(本篇完)