2

我試圖製作一個React應用程序,該對象正在開發同構。 known problems with doing this之一是webpack加載器允許import/require非JavaScript資產,如CSS文件。例如構建服務器部分(React)與webpack同構的webapp,包括用於CSS的樣式加載器

// ExampleComponent.jsx 
import Select from 'react-select'; 
import 'react-select/dist/react-select.css'; 

如果建設有快速的應用程序,然後節點將得到這個進口和失敗,因爲它不能處理CSS文件,它的JavaScript只是期待(和感謝babel-register JSX)。

解決此問題的方法之一是在構建服務器端代碼時構建服務器應用程序(其中包括所有通用部件,如組件,因爲它是一個同構應用程序)時使用webpack中的target: 'node'選項。這應該會導致server.js被構建,然後可以由節點運行。

注:我知道有解決此特定問題的其他途徑(如不使用import/require包括任何不是JavaScript的,但是這是不實際的,在這個發展階段在這個應用

// webpack.config.js 
var webpack = require('webpack'); 
var path = require('path'); 

module.exports = [ 
    // Client build 
    { 
    entry: { 
     'bundle.min': [ 
     'bootstrap-webpack!./bootstrap.config.js', 
     'babel-polyfill', 
     './client/index.jsx' 
     ], 
     'bundle': [ 
     'bootstrap-webpack!./bootstrap.config.js', 
     'babel-polyfill', 
     './client/index.jsx' 
     ] 
    }, 
    output: { 
     path: './dist', 
     filename: '[name].js' 
    }, 
    plugins: [ 
     new webpack.optimize.UglifyJsPlugin({ 
     include: /\.min\.js$/, 
     minimize: true 
     }) 
    ], 
    module: { 
     loaders: [ 
     { 
      test: /\.jsx$/, 
      loader: 'babel-loader', 
      exclude: /node_modules/, 
      query: { 
      plugins: ['transform-runtime'], 
      presets: ['react', 'es2015', 'stage-0'] 
      } 
     }, 
     { 
      test: /\.js$/, 
      loader: 'babel-loader', 
      exclude: /node_modules/, 
      query: { 
      plugins: ['transform-runtime'], 
      presets: ['es2015', 'stage-0'] 
      } 
     }, 
     { 
      test: /\.css$/, 
      loader: 'style-loader!css-loader' 
     }, 
     { test: /\.png$/, 
      loader: "url-loader?limit=100000" 
     }, 

     // Bootstrap 
     { 
      test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'url?limit=10000&mimetype=application/font-woff'}, 
     { 
      test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'url?limit=10000&mimetype=application/octet-stream' 
     }, 
     { 
      test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'file' 
     }, 
     { 
      test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'url?limit=10000&mimetype=image/svg+xml' 
     } 
     ] 
    }, 
    resolve: { 
     extensions: ['', '.js', '.jsx', '.json'] 
    } 
    }, 

    // Server build 
    { 
    entry: './server/server.jsx', 
    target: 'node', 
    node: { 
     console: false, 
     global: false, 
     process: false, 
     Buffer: false, 
     __filename: false, 
     __dirname: false, 
    }, 
    output: { 
     path: './dist', 
     filename: 'server.js', 
    }, 
    module: { 
     loaders: [ 
     { 
      test: /\.jsx$/, 
      loader: 'babel-loader', 
      exclude: /node_modules/, 
      query: { 
      plugins: ['transform-runtime'], 
      presets: ['react', 'es2015', 'stage-0'] 
      } 
     }, 
     { 
      test: /\.js$/, 
      loader: 'babel-loader', 
      exclude: /node_modules/, 
      query: { 
      plugins: ['transform-runtime'], 
      presets: ['es2015', 'stage-0'] 
      } 
     }, 
     { 
      test: /\.json$/, 
      loader: 'json-loader' 
     }, 
     { 
      test: /\.css$/, 
      loader: 'style-loader!css-loader' 
     }, 
     { test: /\.png$/, 
      loader: "url-loader?limit=100000" 
     }, 

     // Bootstrap 
     { 
      test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'url?limit=10000&mimetype=application/font-woff'}, 
     { 
      test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'url?limit=10000&mimetype=application/octet-stream' 
     }, 
     { 
      test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'file' 
     }, 
     { 
      test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, 
      loader: 'url?limit=10000&mimetype=image/svg+xml' 
     } 
     ] 
    }, 
    resolve: { 
     extensions: ['', '.js', '.jsx', '.json'] 
    } 
    } 
]; 

的問題是那麼的風格裝載機利用的window這顯然不會在節點環境中存在。

$ node dist/server.js 
/Users/dpwrussell/Checkout/ExampleApp/dist/server.js:25925 
      return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase()); 
            ^

ReferenceError: window is not defined 

從風格裝載機here

感覺就像我非常接近做這個工作,所以任何想法都會受到歡迎。

回答

2

答案並不是在你的服務器版本中使用style-loader:它的唯一目的是取CSS,將它變成<style>元素,並將其插入到DOM中。大多數人似乎使用ExtractTextPlugin收集他們的CSS包含在服務器端。

相關問題