博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react antd-mobile 项目中实现 css 与 less 局部作用域化
阅读量:6359 次
发布时间:2019-06-23

本文共 12659 字,大约阅读时间需要 42 分钟。

微信公众号:爱写bugger的阿拉斯加
如有问题或建议,请后台留言,我会尽力解决你的问题。

1. 前言

最近搭建的 react 项目想引入 less ,并实现样式局部作用域化,但是在网上找了很多方法试过了都不行,最后打到解决方法,在此记下这惨痛的历程。

2. create-react-app

 是业界最优秀的 React 相关应用开发工具之一,本文档就是以此工具来使用 antd-mobile 组件。

安装和初始化

$ npm install -g create-react-app# 注意:工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试配置代理或使用其他 npm registry。$ create-react-app my-app$ cd my-app$ npm start

打开  访问你的应用。

3. 修改 css 配置

下面是修改文件 webpack.config.js

module.exports = {   entry: __dirname + '/index.js',   output: {     publicPath: '/',     filename: './bundle.js'   },   module: {     loaders: [       {         test: /\.jsx?$/,         exclude: /node_modules/,         loader: 'babel',         query: {           presets: ['es2015', 'stage-0', 'react']         }       },       {         test: /\.css$/,         loader: "style-loader!css-loader?modules"       },     ]   } };

上面代码中,关键的一行是style-loader!css-loader?modules,它在css-loader后面加了一个查询参数modules,表示打开 CSS Modules 功能。

4. 配置 less

首先安装 less 和 less-loader

npm i --save-dev less less-loader

然后在 webpack.config.dev 中配置 less :

//这里我开启自己编写的less文件的css modules功能 除了node_modules库中的less,                    //也就是可以过滤掉antd库中的样式                    {                        test: /\.less$/,                        exclude: [/node_modules/],                        use: [                            require.resolve('style-loader'),                            {                                loader: require.resolve('css-loader'),                                options: {                                    modules: true,                                    localIndexName: "[name]__[local]___[hash:base64:5]"                                },                            },                            {                                loader: require.resolve('less-loader'), // compiles Less to CSS                            },                        ],                    },

5. 完整配置

送上完整的 webpack.config.dev 配置:

'use strict';const autoprefixer = require('autoprefixer');const path = require('path');const webpack = require('webpack');const HtmlWebpackPlugin = require('html-webpack-plugin');const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');const eslintFormatter = require('react-dev-utils/eslintFormatter');const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');const getClientEnvironment = require('./env');const paths = require('./paths');// Webpack uses `publicPath` to determine where the app is being served from.// In development, we always serve from the root. This makes config easier.const publicPath = '/';// `publicUrl` is just like `publicPath`, but we will provide it to our app// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.// Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz.const publicUrl = '';// Get environment variables to inject into our app.const env = getClientEnvironment(publicUrl);// This is the development configuration.// It is focused on developer experience and fast rebuilds.// The production configuration is different and lives in a separate file.module.exports = {    // You may want 'eval' instead if you prefer to see the compiled output in DevTools.    // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.    devtool: 'cheap-module-source-map',    // These are the "entry points" to our application.    // This means they will be the "root" imports that are included in JS bundle.    // The first two entry points enable "hot" CSS and auto-refreshes for JS.    entry: [        // We ship a few polyfills by default:        require.resolve('./polyfills'),        // Include an alternative client for WebpackDevServer. A client's job is to        // connect to WebpackDevServer by a socket and get notified about changes.        // When you save a file, the client will either apply hot updates (in case        // of CSS changes), or refresh the page (in case of JS changes). When you        // make a syntax error, this client will display a syntax error overlay.        // Note: instead of the default WebpackDevServer client, we use a custom one        // to bring better experience for Create React App users. You can replace        // the line below with these two lines if you prefer the stock client:        // require.resolve('webpack-dev-server/client') + '?/',        // require.resolve('webpack/hot/dev-server'),        require.resolve('react-dev-utils/webpackHotDevClient'),        // Finally, this is your app's code:        paths.appIndexJs,        // We include the app code last so that if there is a runtime error during        // initialization, it doesn't blow up the WebpackDevServer client, and        // changing JS code would still trigger a refresh.    ],    output: {        // Add /* filename */ comments to generated require()s in the output.        pathinfo: true,        // This does not produce a real file. It's just the virtual path that is        // served by WebpackDevServer in development. This is the JS bundle        // containing code from all our entry points, and the Webpack runtime.        filename: 'static/js/bundle.js',        // There are also additional JS chunk files if you use code splitting.        chunkFilename: 'static/js/[name].chunk.js',        // This is the URL that app is served from. We use "/" in development.        publicPath: publicPath,        // Point sourcemap entries to original disk location (format as URL on Windows)        devtoolModuleFilenameTemplate: info =>            path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'),    },    resolve: {        // This allows you to set a fallback for where Webpack should look for modules.        // We placed these paths second because we want `node_modules` to "win"        // if there are any conflicts. This matches Node resolution mechanism.        // https://github.com/facebookincubator/create-react-app/issues/253        modules: ['node_modules', paths.appNodeModules].concat(            // It is guaranteed to exist because we tweak it in `env.js`            process.env.NODE_PATH.split(path.delimiter).filter(Boolean)        ),        // These are the reasonable defaults supported by the Node ecosystem.        // We also include JSX as a common component filename extension to support        // some tools, although we do not recommend using it, see:        // https://github.com/facebookincubator/create-react-app/issues/290        // `web` extension prefixes have been added for better support        // for React Native Web.        extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'],        alias: {            // Support React Native Web            // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/            'react-native': 'react-native-web',        },        plugins: [            // Prevents users from importing files from outside of src/ (or node_modules/).            // This often causes confusion because we only process files within src/ with babel.            // To fix this, we prevent you from importing files out of src/ -- if you'd like to,            // please link the files into your node_modules/ and let module-resolution kick in.            // Make sure your source files are compiled, as they will not be processed in any way.            new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),        ],    },    module: {        strictExportPresence: true,        rules: [            // TODO: Disable require.ensure as it's not a standard language feature.            // We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176.            // { parser: { requireEnsure: false } },            // First, run the linter.            // It's important to do this before Babel processes the JS.            {                test: /\.(js|jsx|mjs)$/,                enforce: 'pre',                use: [{                    options: {                        formatter: eslintFormatter,                        eslintPath: require.resolve('eslint'),                    },                    loader: require.resolve('eslint-loader'),                }, ],                include: paths.appSrc,            },            {                // "oneOf" will traverse all following loaders until one will                // match the requirements. When no loader matches it will fall                // back to the "file" loader at the end of the loader list.                oneOf: [                    // "url" loader works like "file" loader except that it embeds assets                    // smaller than specified limit in bytes as data URLs to avoid requests.                    // A missing `test` is equivalent to a match.                    {                        test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],                        loader: require.resolve('url-loader'),                        options: {                            limit: 10000,                            name: 'static/media/[name].[hash:8].[ext]',                        },                    },                    // Process JS with Babel.                    {                        test: /\.(js|jsx|mjs)$/,                        include: paths.appSrc,                        loader: require.resolve('babel-loader'),                        options: {                            // This is a feature of `babel-loader` for webpack (not Babel itself).                            // It enables caching results in ./node_modules/.cache/babel-loader/                            // directory for faster rebuilds.                            cacheDirectory: true,                        },                    },                    {                        test: /\.css$/,                        loader: "style-loader!css-loader?modules"                    },                    //@Lynn 这里我开启自己编写的less文件的css modules功能 除了node_modules库中的less,                    //也就是可以过滤掉antd库中的样式                    {                        test: /\.less$/,                        exclude: [/node_modules/],                        use: [                            require.resolve('style-loader'),                            {                                loader: require.resolve('css-loader'),                                options: {                                    modules: true,                                    localIndexName:"[name]__[local]___[hash:base64:5]"                                },                            },                            {                                loader: require.resolve('less-loader'), // compiles Less to CSS                            },                        ],                    },                    // "file" loader makes sure those assets get served by WebpackDevServer.                    // When you `import` an asset, you get its (virtual) filename.                    // In production, they would get copied to the `build` folder.                    // This loader doesn't use a "test" so it will catch all modules                    // that fall through the other loaders.                    {                        // Exclude `js` files to keep "css" loader working as it injects                        // its runtime that would otherwise processed through "file" loader.                        // Also exclude `html` and `json` extensions so they get processed                        // by webpacks internal loaders.                        exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],                        loader: require.resolve('file-loader'),                        options: {                            name: 'static/media/[name].[hash:8].[ext]',                        },                    },                ],            },            // ** STOP ** Are you adding a new loader?            // Make sure to add the new loader(s) before the "file" loader.        ],    },    plugins: [        // extractLess,        // Makes some environment variables available in index.html.        // The public URL is available as %PUBLIC_URL% in index.html, e.g.:        // 
// In development, this will be an empty string. new InterpolateHtmlPlugin(env.raw), // Generates an `index.html` file with the

webpack.config.prod 中的配置也同理,把 css 与 less 的配置覆盖到 webpack.config.prod 中相应的位置即可。

6. 最后

送上阮老师的

希望本文对你有点帮助。

对 全栈开发 有兴趣的朋友可以扫下方二维码关注我的公众号 —— 爱写bugger的阿拉斯加

分享 web 开发相关的技术文章,热点资源,全栈程序员的成长之路

陛下...看完奏折,点个赞再走吧!

爱写bugger的阿拉斯加

转载地址:http://kvbma.baihongyu.com/

你可能感兴趣的文章
设计模式-责任链模式(17)
查看>>
数论 + 公式 - HDU 4335 What is N?
查看>>
Public Prize
查看>>
生成 39 条形码
查看>>
抽象工厂理解
查看>>
计网第四章网络层(二)
查看>>
vs 行数
查看>>
nodejs下的express安装
查看>>
表单中的单文件点击和拖拽上传
查看>>
BZOJ1396 识别子串
查看>>
【转】numpy中 meshgrid 和 mgrid 的区别和使用
查看>>
【转】python中的闭包
查看>>
编程总结模版
查看>>
成为linux的合格公民
查看>>
小心陷阱:二维动态内存的不连续性
查看>>
转:关于启用 HTTPS 的一些经验分享(一)
查看>>
复习HTML、CSS、JS练习题
查看>>
[Android] 进程(Process)和线程(Thread)
查看>>
STL容器及泛型算法
查看>>
Android 检查手机和电脑连接的时候,执行 adb devices后,提示adb server is out of date. killing.....
查看>>