introduction
Next.js 允许你从js文件中导入CSS 文件,这是由于next.js 继承于import
的概念,但是扩展至js之外 ..
增加一个全局样式
全局样式会导入到pages/_app.js
…
于是我们可以创建一个styles.css
将这个全局样式导入到pages/_app.js
假设下面是我们的pages/_app.js
import '../styles.css'
// This default export is required in a new `pages/_app.js` file.
export default function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
这些样式将会使用到所有页面和组件 … 由于全局样式的特性,并且避免冲突,它们仅仅能够导入到pages/_app.js
在开发中,样式能够编辑它们且热重载-意味着我们能够保留应用状态 ..
在生产中,所有的css文件将自动的连接到单个最小化的.css
文件 ..
从node_modules
导入样式
从Next.js 9.5.4开始,从node_modules
中导入样式文件是允许的 …
对于全局样式,例如bootstrap
或者 nprogress
,可以导入到pages/_app.js
中 ..
为了导入由第三方组件需要的CSS,你能够在组件中这样做 …
// components/ExampleDialog.js
import { useState } from 'react'
import { Dialog } from '@reach/dialog'
import VisuallyHidden from '@reach/visually-hidden'
import '@reach/dialog/styles.css'
function ExampleDialog(props) {
const [showDialog, setShowDialog] = useState(false)
const open = () => setShowDialog(true)
const close = () => setShowDialog(false)
return (
<div>
<button onClick={open}>Open Dialog</button>
<Dialog isOpen={showDialog} onDismiss={close}>
<button className="close-button" onClick={close}>
<VisuallyHidden>Close</VisuallyHidden>
<span aria-hidden>×</span>
</button>
<p>Hello there. I am a dialog</p>
</Dialog>
</div>
)
}
增加组件级别的CSS
Next.js 支持 CSS Modules 模块化(通过使用[name].module.css
文件命名约定即可 ..
CSS modules 是一个局部范围css(通过自动创建一个独一无二的类名),这允许你使用相同的CSS 类名在不同的文件中(而不需要担心冲突) …
这种好处使得CSS module作为包含组件级别的CSS为理想化的选择,CSS 模块化文件能够导入到应用的任何位置 ..
举个例子,考虑在components
文件夹下有一个Button
组件 ..
假设创建一个具有css样式的css文件
/*
You do not need to worry about .error {} colliding with any other `.css` or
`.module.css` files!
*/
.error {
color: white;
background-color: red;
}
然后将它引用到Button组件上,导入css文件
import styles from './Button.module.css'
export function Button() {
return (
<button
type="button"
// Note how the "error" class is accessed as a property on the imported
// `styles` object.
className={styles.error}
>
Destroy
</button>
)
}
CSS 模块是一个可选的特性,(仅仅通过.module.css
扩展进行启动),常规的<link>
样式表以及全局CSS文件仍然是支持的 ..
在生产环境下,所有的CSS 模块文件将自动的联接到许多最小化并且代码分割的’.css’文件中 ,这些.css
文件表示应用中的热执行路径,确保最少量的CSS加载以便应用程序绘制 ….
Sass 支持
Next.js 允许你同时使用.scss
以及 .sass
扩展,你能够使用组件级别的Sass(通过Css模块以及.module.scss
或者 .module.sass
扩展
但是首先我们需要安装sass
…
npm install --save-dev sass
Sass支持有一些相同的好处并且限制(由于内置CSS支持) …
注意: Sass 支持两种不同的语法形式,每一个都有它们自己的扩展,这个.scss
扩展需要你使用 SCSS syntax,sass
扩展需要你使用 Indented Syntax (“Sass”) ..
如果你不知道选择哪一种,可以先从.scss
开始(它是css的超集),并且不需要学习Indented Syntax(“Sass”)
定制Sass 选择
如果你想要配置Sass 编译器,你能够在next.config.js
中配置 sassOptions
举个例子,增加包括的路径
const path = require('path')
module.exports = {
sassOptions: {
includePaths: [path.join(__direname,'styles')]
}
}
Sass 变量
Next.js 支持Sass 变量(从Css模块文件中暴露的) ..
举个例子,使用暴露的primaryColor
Sass变量 …
/* variables.module.scss */
$primary-color: #64ff00;
:export {
primaryColor: $primary-color;
}
然后在页面中
// pages/_app.js
import variables from '../styles/variables.module.scss'
export default function MyApp({ Component, pageProps }) {
return (
<Layout color={variables.primaryColor}>
<Component {...pageProps} />
</Layout>
)
}
Css-in-JS
当然现在我们可以使用内联样式,这只是CSS-in-JS解决方案的一种
function HiThere() {
return <p style={{ color: 'red' }}>hi there</p>
}
export default HiThere
我们也能够使用 styled-jsx 去提供隔离界别的CSS 样式,这意味着支持 ‘shadow CSS”,类似于Web 组件 ..不幸的是(Web组件不支持服务器渲染并且仅JS)
例如以下示例展示了styled-jsx
解决方案:
function HelloWorld() {
return (
<div>
Hello world
<p>scoped!</p>
<style jsx>{`
p {
color: blue;
}
div {
background: red;
}
@media (max-width: 600px) {
div {
background: blue;
}
}
`}</style>
<style global jsx>{`
body {
background: black;
}
`}</style>
</div>
)
}
export default HelloWorld
同样还有其他的CSS-in-JS解决方案(例如 Styled Components) …
FAQ
- js禁用的情况下使用
在生产构建下next start
css 仍然会被加载,在开发阶段,我们需要js启动去提供最好的开发者体验(使用快速刷新))