nextjs + typescript + jest + postcss
从零开始配置项目
在 github 上 nextjs 的源码中,有集成好的 examples,在使用过程中可以直接拿来做参考。
一、 nextjs + typeScript
nextjs 官网中有 nextjs 使用的文档,配置 ts 的方法有两种,
1. 使用 with-jest-typescript
使用 create-next-app
,通过 yarn
或者 npx
进行安装。
1 | $ npx create-next-app --example with-jest-typescript with-jest-typescript-app |
运行以上指令直接拷贝出一份已经集成好的 ts + jest 模板
2. 自己配置(未实践)
- 根据官网文档的 Getting Start 进行初始化项目
- 安装 ts ,添加 ts 相关配置。
- 安装 jest,添加 jest 相关配置。
配置完之后:next.config.js 文件为:1
2
3const withTypescript = require('@zeit/next-typescript')
module.exports = withTypescript()
二、配置 css
- 安装
@zeit/next-css
1 | $ npm install --save @zeit/next-css |
- 引入编译后的 css 文件
项目运行之后的 css 文件会编译到 .next/static/style.css
,我们需要在 _document.js
引入这个 css 文件 /_next/static/style.css
例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// ./pages/_document.js
import Document, { Head, Main, NextScript } from 'next/document'
class MyDocument extends Document {
render() {
return (
<html>
<Head>
<link rel="stylesheet" href="/_next/static/style.css" />
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}
export default MyDocument;
- 配置 css 解析
在 next.config.js 文件中配置 css 解析。
1 | const withTypescript = require('@zeit/next-typescript') |
此时在每个项目中的 css 文件都可以正常编译和引入,但是没有模块化和类名编译,
例如:
1 | // css 文件 style.css |
- css modules
配置 css 模块化之后,每个模块编译之后的类名都是全局唯一的:
1 | // next.config.js |
例如:
1 | // css 文件 style.css |
优化 css-loader 配置
css-loader
的配置可以通过属性cssLoaderOptions
添加一些其他的配置。1
2
3
4
5
6
7
8
9
10
11
12
13
14// next.config.js
const withTypescript = require('@zeit/next-typescript')
const withCSS = require('@zeit/next-css')
module.exports = withTypescript(withCSS({
cssModules: true
cssLoaderOptions: {
// 0 => no loaders (default); 1 => postcss-loader; 2 => postcss-loader, sass-loader
importLoaders: 1,
// 指定编译类名方式为:模块名 + 类名 + 随机编码
localIdentName: '[name]-[local]-[hash:base64:5]',
}
}))例如:
1 | // css 文件 style.css |
三、配置 postcss
创建 postcss.config.js 文件:
1 | // 例如 |
配置 postcss 解析:
1 | // next.config.js |
四、图片的加载
方法一
通过 webpack 配置进行图片解析:
1 | // next.config.js |
方法二
使用 next-images(未实践)
具体配置方法请参考官网
五、遇到的问题
问题: 根据以上配置,最后会遇到一个问题,在 node_modules 里的 css 文件在项目执行时被编译打包,导致使用的第三方组件样式混乱。
解决方案: 官方所处的 postcss 配置不能指定编译的路径,所以最后舍弃使用官方提供的 css 打包编译方式,使用原声的 webpack 配置解析 postcss。配置如下:
1 | const withTypescript = require('@zeit/next-typescript'); |
注意:原本只是使用 style-loader 解析 css ,但是存在服务器端渲染问题,会报错:window is undefined。通过查询最后我们选择了 isomorphic-style-loader 进行服务器端渲染的 css 解析。