cerebral/classy-ui

NextJS/Now Build Clarification

Closed this issue · 2 comments

https://classy-ui.io/install/next-js

I think this applies to other environments as well, but is the idea to check the generated classy-ui.css file in to version control? I can get it to build fine locally and when I deploy with now manually the file is present so it works, but the file isn't built in time for the pre-rendering of some pages in NextJS and it fails.

src/pages/_document.js

import Document, { Html, Head, Main, NextScript } from "next/document";

class MyDocument extends Document {
  render() {
    return (
      <Html>
        <Head>
          {process.env.NODE_ENV === "production" ? (
            <link rel="stylesheet" href="/classy-ui.css" />
          ) : null}
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

src/pages/index.js

import React from "react";
import { compose, tokens } from "classy-ui";

const title = compose(tokens.color.RED_200, tokens.fontSize.EXTRA_LARGE);

const Home = ({ posts }) => {
  return (
    <div>
      <h1 className={title}>My Title</h1>
    </div>
  );
};

// Opts in to nextjs static pre-rendering at build time
export const getStaticProps = async () => {
  return {};
};

export default Home;

.babelrc

{
  "presets": ["next/babel"],
  "plugins": [["classy-ui/plugin", { "output": "public" }]]
}

This may be more of a zeit now build env issue actually. The static pre rendering is fine. When building in now the classy-ui plugin isn't able to find the public directory I think.

10:43:22.527
> Build error occurred
10:43:22.528
Error: ENOENT: no such file or directory, open '/zeit/5e908f88/public/classy-ui.css'
10:43:22.528
    at Object.openSync (fs.js:440:3)
10:43:22.528
    at Object.writeFileSync (fs.js:1265:35)
10:43:22.528
    at process.<anonymous> (/zeit/5e908f88/node_modules/classy-ui/lib/plugin/index.js:91:18)
10:43:22.529
    at process.emit (events.js:223:5)
10:43:22.529
    at process.exit (internal/process/per_thread.js:158:15)
10:43:22.529
    at /zeit/5e908f88/node_modules/next/dist/cli/next-build.js:15:154
10:43:22.529
    at processTicksAndRejections (internal/process/task_queues.js:94:5) {
10:43:22.529
  errno: -2,
10:43:22.529
  syscall: 'open',
10:43:22.529
  code: 'ENOENT',
10:43:22.529
  path: '/zeit/5e908f88/public/classy-ui.css'
10:43:22.529
}
10:43:22.549
error Command failed with exit code 1.
10:43:22.549
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
10:43:22.562
Error: Exited with 1
10:43:22.562
    at ChildProcess.<anonymous> (/zeit/279625c80a3b1659/.build-utils/node_modules/@now/build-utils/dist/index.js:31347:24)
10:43:22.562
    at ChildProcess.emit (events.js:223:5)
10:43:22.562
    at ChildProcess.EventEmitter.emit (domain.js:475:20)
10:43:22.562
    at maybeClose (internal/child_process.js:1021:16)
10:43:22.562
    at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5)

Root cause: empty public directory isn't included in now build (or at least until it's checked in to source control? haven't verified).

Solution: add any file to public directory (usually you'll have a favicon here anyway).

Potential improvement: classy could mkdir -p for the output path when writing classy-ui.css?