引javascript
create-react-app 建立一个 react 项目. 而后引入 antd. antd
官网的流程须要自行写配置文件. 与 webpack
相结合. 固然这种作法也无不妥. 可是若是你也想一观背后别有洞天的代码. 那就看下去!css
商业互捧html
前端发展突飞猛进. 为了避免使诸位同仁在看本文是产生疑惑. 在此罗列出这次项目中使用到的环境及库的版本前端
若是, 在配置过程当中遇到问题, 可参照对应版本查找解决方案.java
推荐使用 yarn
node
# npm
npm install antd --save
# yarn
yarn add antd
复制代码
因为
antd
是由less
开发的样式组件, 因此咱们也须要引入less
及less-loader
react
# npm
npm install less less-loader --save
# yarn
yarn add less less-loader
复制代码
按需加载组件库, 咱们还须要一个插件 babel-plugin-importwebpack
更改配置项时注意图中区别git
在使用 create-react-app
建立了 react
项目时. 咱们在项目目录中是看不到关于 webpack
的配置项的. 而 create-react-app
也为咱们提供了能看到它的方式.github
咱们须要在项目终端运行一行命令:
# npm
npm run eject
# yarn
yarn eject
复制代码
此时, 咱们就能够看到项目中多了两个文件夹 config
和 scripts
. 再打开 package.json
发现它也是大变样. 不过咱们关注的重点主要在 config
文件中的 webpack.config.js
上
// webpack.config.js
...
// style files regexes
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
// 此处添加: 自定义添加less配置
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;
// 添加结束
...
复制代码
在
file-loader
上面引入规则 顺序不可变动. 当配置多个 loader 时, loader 的执行顺序是从右到左, 从下到上
...
{
test: sassModuleRegex,
use: getStyleLoaders(
{
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
},
'sass-loader'
),
},
// 此处添加: 自定义添加 less
{
test: lessRegex,
exclude: lessModuleRegex,
use: getStyleLoaders(
{
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
},
'less-loader'
),
sideEffects: true,
},
{
test: lessModuleRegex,
use: getStyleLoaders(
{
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
},
'less-loader'
),
},
// 添加结束!
{
loader: require.resolve('file-loader'),
// Exclude `js` files to keep "css" loader working as it injects
// its runtime that would otherwise be processed through "file" loader.
// Also exclude `html` and `json` extensions so they get processed
// by webpacks internal loaders.
exclude: [/\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/],
options: {
name: 'static/media/[name].[hash:8].[ext]',
},
},
// ** STOP ** Are you adding a new loader?
...
复制代码
...
plugins: [
[
require.resolve('babel-plugin-named-asset-import'),
{
loaderMap: {
svg: {
ReactComponent:
'@svgr/webpack?-svgo,+titleProp,+ref![path]',
},
},
},
],
// 此处添加: 按需引入 antd
[
require.resolve('babel-plugin-import'),
{
libraryName: 'antd',
"libraryDirectory": "es",
style: true
}
]
// 添加结束
],
...
复制代码
...
if (preProcessor) {
loaders.push(
{
loader: require.resolve('resolve-url-loader'),
options: {
sourceMap: isEnvProduction && shouldUseSourceMap,
},
},
{
loader: require.resolve(preProcessor),
options: {
sourceMap: true,
},
}
);
}
// 此处添加: 自定义主题
if (preProcessor && preProcessor === 'less-loader') {
loaders.push(
{
loader: require.resolve('resolve-url-loader'),
options: {
sourceMap: isEnvProduction && shouldUseSourceMap
}
},
{
loader: require.resolve(preProcessor),
options: {
sourceMap: true,
javascriptEnabled: true,
modifyVars: {
'primary-color': '#ff4757',
'link-color': '#ff4757',
'border-radius-base': '2px',
}
}
}
);
}
// 添加结束
return loaders;
...
复制代码
此后, 咱们无需在任何地方引入 antd
的 css 文件!
配置结束, 运行项目!