最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

reactantd-mobile项目中如何实现css与less局部作用域化的功能

来源:动视网 责编:小采 时间:2020-11-27 19:32:56
文档

reactantd-mobile项目中如何实现css与less局部作用域化的功能

reactantd-mobile项目中如何实现css与less局部作用域化的功能:这篇文章给大家介绍的内容是关于react antd-mobile项目中如何实现 css 与 less 局部作用域化的功能,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。1、前言最近搭建的 react 项目想引入 less ,并实现样式局部作用域化,但是在网上找了很多
推荐度:
导读reactantd-mobile项目中如何实现css与less局部作用域化的功能:这篇文章给大家介绍的内容是关于react antd-mobile项目中如何实现 css 与 less 局部作用域化的功能,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。1、前言最近搭建的 react 项目想引入 less ,并实现样式局部作用域化,但是在网上找了很多


这篇文章给大家介绍的内容是关于react antd-mobile项目中如何实现 css 与 less 局部作用域化的功能,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

1、前言

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

2、create-react-app

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

打开 http://localhost:3000/ 访问你的应用。

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:base: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/incubator/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/incubator/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/incubator/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/incubator/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:base: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.:
 // <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
 // In development, this will be an empty string.
 new InterpolateHtmlPlugin(env.raw),
 // Generates an `index.html` file with the <script> injected.
 new HtmlWebpackPlugin({
 inject: true,
 template: paths.appHtml,
 }),
 // Add module names to factory functions so they appear in browser profiler.
 new webpack.NamedModulesPlugin(),
 // Makes some environment variables available to the JS code, for example:
 // if (process.env.NODE_ENV === 'development') { ... }. See `./env.js`.
 new webpack.DefinePlugin(env.stringified),
 // This is necessary to emit hot updates (currently CSS only):
 new webpack.HotModuleReplacementPlugin(),
 // Watcher doesn't work well if you mistype casing in a path so we use
 // a plugin that prints an error when you attempt to do this.
 // See https://github.com/incubator/create-react-app/issues/240
 new CaseSensitivePathsPlugin(),
 // If you require a missing module and then `npm install` it, you still have
 // to restart the development server for Webpack to discover it. This plugin
 // makes the discovery automatic so you don't have to restart.
 // See https://github.com/incubator/create-react-app/issues/186
 new WatchMissingNodeModulesPlugin(paths.appNodeModules),
 // Moment.js is an extremely popular library that bundles large locale files
 // by default due to how Webpack interprets its code. This is a practical
 // solution that requires the user to opt into importing specific locales.
 // https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
 // You can remove this if you don't use Moment.js:
 new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
 ],
 // Some libraries import Node modules but don't use them in the browser.
 // Tell Webpack to provide empty mocks for them so importing them works.
 node: {
 dgram: 'empty',
 fs: 'empty',
 net: 'empty',
 tls: 'empty',
 child_process: 'empty',
 },
 // Turn off performance hints during development because we don't do any
 // splitting or minification in interest of speed. These warnings become
 // cumbersome.
 performance: {
 hints: false,
 },
};

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

相关文章推荐:

使用FormData()将ajax文件上传的代码

JS简单实现防抖 - debounce和节流 - throttle

文档

reactantd-mobile项目中如何实现css与less局部作用域化的功能

reactantd-mobile项目中如何实现css与less局部作用域化的功能:这篇文章给大家介绍的内容是关于react antd-mobile项目中如何实现 css 与 less 局部作用域化的功能,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。1、前言最近搭建的 react 项目想引入 less ,并实现样式局部作用域化,但是在网上找了很多
推荐度:
标签: 如何 项目 css
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top