2017-08-15 19 views
2

sssを使用してCSSモジュールを設定しようとしています。私はいくつかのチュートリアルに従ってきましたが、どれもうまくいかないようです。 webpackの設定は、主にcreate-react-scriptsによって作成されました。私はこのエラーが発生したようだ "モジュールが見つかりませんでした: 'スタイル'を解決できません。このエラーは、以下のModal.jsファイルのimportステートメントで生成されたようです。 ( "../css/modal.scss"からのインポートスタイル) 私はSass Loaderをインストールしました。私のpackage.jsonファイルは以下にあります。モジュールが見つかりません: 'スタイル'を解決できません

webpack.config.dev.js:

'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'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 

// 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: [ 
    // 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'), 
    // We ship a few polyfills by default: 
    require.resolve('./polyfills'), 
    // Errors should be considered fatal in development 
    require.resolve('react-error-overlay'), 
    // 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: { 
    // Next line is not used in dev but WebpackDevServer crashes without it: 
    path: paths.appBuild, 
    // 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', '.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), 
    ], 
    }, 
    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)$/, 
     enforce: 'pre', 
     use: [ 
      { 
      options: { 
       formatter: eslintFormatter, 

      }, 
      loader: require.resolve('eslint-loader'), 
      }, 
     ], 
     include: paths.appSrc, 
     }, 
     // ** ADDING/UPDATING LOADERS ** 
     // The "file" loader handles all assets unless explicitly excluded. 
     // The `exclude` list *must* be updated with every change to loader extensions. 
     // When adding a new loader, you must add its `test` 
     // as a new entry in the `exclude` list for "file" loader. 

     // "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. 
     { 
     exclude: [ 
      /\.html$/, 
      /\.(js|jsx)$/, 
      /\.css$/, 
      /\.json$/, 
      /\.bmp$/, 
      /\.gif$/, 
      /\.jpe?g$/, 
      /\.png$/, 
      /\.scss$/ 
     ], 
     loader: require.resolve('file-loader'), 
     options: { 
      name: 'static/media/[name].[hash:8].[ext]', 
     }, 
     }, 
     // "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)$/, 
     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, 
     }, 
     }, 
     // "postcss" loader applies autoprefixer to our CSS. 
     // "css" loader resolves paths in CSS and adds assets as dependencies. 
     // "style" loader turns CSS into JS modules that inject <style> tags. 
     // In production, we use a plugin to extract that CSS to a file, but 
     // in development "style" loader enables hot editing of CSS. 
     { 
     test: /\.css$/, 
     use: [ 
      require.resolve('style-loader'), 
      { 
      loader: require.resolve('css-loader'), 
      options: { 
       importLoaders: 1, 
       modules: true, 
       localIdentName: "[name]__[local]___[hash:base64:5]" 
      }, 
      }, 
      { 
      loader: require.resolve('postcss-loader'), 
      options: { 
       // Necessary for external CSS imports to work 
       // https://github.com/facebookincubator/create-react-app/issues/2677 
       ident: 'postcss', 
       plugins:() => [ 
       require('postcss-flexbugs-fixes'), 
       autoprefixer({ 
        browsers: [ 
        '>1%', 
        'last 4 versions', 
        'Firefox ESR', 
        'not ie < 9', // React doesn't support IE8 anyway 
        ], 
        flexbox: 'no-2009', 
       }), 
       ], 
      }, 
      }, 
     ], 
     }, 
     { 
     test: /\.scss$/, 
     use: ExtractTextPlugin.extract({ 
      fallback:'style-loader', 
      use: [ 
      { 
       loader: 'css-loader', 
       q: { 
       modules: true, 
       sourcemap: true, 
       importLoaders: 2, 
       localIdentName: '[name]__[local]__[hash:base64:5]' 
       } 
      }, 
      'sass-loader' 
      ] 
     }), 
     loaders: [ 
      require.resolve('style-loader'), 
      require.resolve('css-loader'), 
      require.resolve('sass-loader') 
     ] 
     } 
     // ** STOP ** Are you adding a new loader? 
     // Remember to add the new extension(s) to the "file" loader exclusion list. 
    ], 
    }, 
    plugins: [ 
    // 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/facebookincubator/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/facebookincubator/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$/), 

    new ExtractTextPlugin({'styles.css'}), 
    ], 
    // 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', 
    }, 
    // 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, 
    }, 
}; 

Modal.jsファイル:

import React from "react"; 
import ReactDOM from "react-dom"; 
// import styles from "../css/popUpBox.css"; 
import styles from "../css/modal.scss"; // ERROR HAPPENS HERE!! 

...ファイルが続く

Package.json:

{ 
    "name": "react-hackboard", 
    "version": "0.1.0", 
    "private": true, 
    "dependencies": { 
    "autoprefixer": "7.1.1", 
    "babel-core": "6.25.0", 
    "babel-eslint": "7.2.3", 
    "babel-jest": "20.0.3", 
    "babel-loader": "7.0.0", 
    "babel-preset-react-app": "^3.0.1", 
    "babel-runtime": "6.23.0", 
    "case-sensitive-paths-webpack-plugin": "2.1.1", 
    "chalk": "1.1.3", 
    "css-loader": "0.28.4", 
    "dotenv": "4.0.0", 
    "eslint": "3.19.0", 
    "eslint-config-react-app": "^1.0.5", 
    "eslint-loader": "1.7.1", 
    "eslint-plugin-flowtype": "2.34.0", 
    "eslint-plugin-import": "2.2.0", 
    "eslint-plugin-jsx-a11y": "5.0.3", 
    "eslint-plugin-react": "7.1.0", 
    "extract-text-webpack-plugin": "2.1.2", 
    "file-loader": "0.11.2", 
    "fs-extra": "3.0.1", 
    "html-webpack-plugin": "2.29.0", 
    "jest": "20.0.4", 
    "node-sass": "^4.5.3", 
    "object-assign": "4.1.1", 
    "postcss-flexbugs-fixes": "3.0.0", 
    "postcss-loader": "2.0.6", 
    "promise": "7.1.1", 
    "react": "^15.6.1", 
    "react-dev-utils": "^3.0.2", 
    "react-dom": "^15.6.1", 
    "react-error-overlay": "^1.0.9", 
    "react-redux": "^5.0.5", 
    "redux": "^3.7.2", 
    "redux-createreducer": "^2.0.0", 
    "redux-thunk": "^2.2.0", 
    "sass-loader": "^6.0.6", 
    "style-loader": "0.18.2", 
    "sw-precache-webpack-plugin": "0.11.3", 
    "url-loader": "0.5.9", 
    "webpack": "2.6.1", 
    "webpack-dev-server": "2.5.0", 
    "webpack-manifest-plugin": "1.1.0", 
    "whatwg-fetch": "2.0.3" 
    }, 
    "scripts": { 
    "start": "node scripts/start.js", 
    "build": "node scripts/build.js", 
    "test": "node scripts/test.js --env=jsdom" 
    }, 
    "jest": { 
    "collectCoverageFrom": [ 
     "src/**/*.{js,jsx}" 
    ], 
    "setupFiles": [ 
     "<rootDir>/config/polyfills.js" 
    ], 
    "testMatch": [ 
     "<rootDir>/src/**/__tests__/**/*.js?(x)", 
     "<rootDir>/src/**/?(*.)(spec|test).js?(x)" 
    ], 
    "testEnvironment": "node", 
    "testURL": "http://localhost", 
    "transform": { 
     "^.+\\.(js|jsx)$": "<rootDir>/node_modules/babel-jest", 
     "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js", 
     "^(?!.*\\.(js|jsx|css|json)$)": "<rootDir>/config/jest/fileTransform.js" 
    }, 
    "transformIgnorePatterns": [ 
     "[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$" 
    ], 
    "moduleNameMapper": { 
     "^react-native$": "react-native-web" 
    }, 
    "moduleFileExtensions": [ 
     "web.js", 
     "js", 
     "json", 
     "web.jsx", 
     "jsx" 
    ] 
    }, 
    "babel": { 
    "presets": [ 
     "react-app" 
    ] 
    }, 
    "eslintConfig": { 
    "extends": "react-app" 
    }, 
    "devDependencies": { 
    "node-sass": "^4.5.3", 
    "sass-loader": "^6.0.6", 
    "webpack": "^2.6.1" 
    } 
} 
+0

「../ssss/modal.scss」からの「インポートスタイル」から何を得ることが期待されますか?私は 'import" ../css/modal.scss ";'で十分だと思います。 –

+0

@ HankChiu私はすべての私のCSSクラスを含むオブジェクトを取得することを期待しています。私はCSSモジュールを設定しようとしていますが、純粋なCSSの代わりにお尻を使用しています。それは意味をなしますか?したがって、なぜ私はすべてのスタイルを "スタイル"オブジェクトにインポートしようとしているのですか? –

+0

'style-loader'の設定について[this](https://github.com/webpack/webpack/issues/1470)を確認してください –

答えて

2

私は同じ問題を抱えていました。王の解決策。

これらのコード行をWebpack設定ファイルの "rules"配列に追加してください。

 { 
     test: /\.sass$/, 
     include: paths.appSrc, 
     use: [ 
      require.resolve('style-loader'), 
      { 
      loader: require.resolve('css-loader'), 
      options: { 
       importLoaders: 1, 
      }, 
      }, 
      { 
      loader: require.resolve('sass-loader') 
      } 
     ] 
     }, 

とあなたの情報、 @import「パス/に/ sass.file」のためのあなたは、コンポーネントの反応のためにあなたのSASSファイルとインポート「パス/に/ sass.file」の一つにimport文を使用している場合。

これはあなたにとってもうまくいくと思います。

4

特定のローダに依存性が見つからないということです。

 { 
     test: /\.scss$/, 
     include: paths.appSrc, 
     loaders: [ 
      require.resolve('style-loader'), 
      require.resolve('css-loader'), 
      require.resolve('sass-loader') 
     ] 
     } 

これを: 次のようにあなたのローダーの設定を変更し

糸スタイル・ローダーCSS-ローダーSASS-ローダーを追加

以下のようにして、それを解決することができますscssが動作するはずです。

関連する問題