You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

146 lines
3.8 KiB

  1. var path = require('path')
  2. var webpack = require('webpack')
  3. var ExtractTextPlugin = require('extract-text-webpack-plugin')
  4. var deepExtend = require('deep-extend')
  5. var autoprefixer = require('autoprefixer')
  6. var loadersByExtension = require('./build-tools/loadersByExtension')
  7. module.exports = function(options) {
  8. // Special options, that have logic in this file
  9. // ...with defaults
  10. var specialOptions = deepExtend({}, {
  11. hot: false,
  12. separateStylesheets: true,
  13. minimize: false,
  14. longTermCaching: false,
  15. sourcemaps: false,
  16. }, options._special)
  17. var loadersMap = {
  18. 'js(x)?': {
  19. loader: 'babel?retainLines=true',
  20. include: [ path.join(__dirname, 'src') ],
  21. },
  22. 'json': 'json-loader',
  23. 'txt|yaml': 'raw-loader',
  24. 'png|jpg|jpeg|gif|svg': specialOptions.disableAssets ? 'null-loader' : 'url-loader?limit=10000',
  25. 'woff|woff2': specialOptions.disableAssets ? 'null-loader' : 'url-loader?limit=100000',
  26. 'ttf|eot': specialOptions.disableAssets ? 'null-loader' : 'file-loader',
  27. "worker.js": ["worker-loader?inline=true", "babel"]
  28. }
  29. var plugins = []
  30. if( specialOptions.separateStylesheets ) {
  31. plugins.push(new ExtractTextPlugin('[name].css' + (specialOptions.longTermCaching ? '?[contenthash]' : ''), {
  32. allChunks: true
  33. }))
  34. }
  35. if( specialOptions.minimize ) {
  36. plugins.push(
  37. new webpack.optimize.UglifyJsPlugin({
  38. compressor: {
  39. warnings: false
  40. }
  41. }),
  42. new webpack.optimize.DedupePlugin()
  43. )
  44. plugins.push( new webpack.NoErrorsPlugin())
  45. }
  46. plugins.push(
  47. new webpack.DefinePlugin({
  48. 'process.env': {
  49. NODE_ENV: specialOptions.minimize ? JSON.stringify('production') : null,
  50. WEBPACK_INLINE_STYLES: !Boolean(specialOptions.separateStylesheets)
  51. },
  52. }))
  53. var cssLoader = 'css-loader!postcss-loader'
  54. var completeStylesheetLoaders = deepExtend({
  55. 'css': cssLoader,
  56. 'scss': cssLoader + '!' + 'sass-loader?outputStyle=expanded&sourceMap=true&sourceMapContents=true',
  57. 'less': cssLoader + '!' + 'less-loader',
  58. }, specialOptions.stylesheetLoaders)
  59. if(specialOptions.cssModules) {
  60. cssLoader = cssLoader + '?module' + (specialOptions.minimize ? '' : '&localIdentName=[path][name]---[local]---[hash:base64:5]')
  61. }
  62. Object.keys(completeStylesheetLoaders).forEach(function(ext) {
  63. var ori = completeStylesheetLoaders[ext]
  64. if(specialOptions.separateStylesheets) {
  65. completeStylesheetLoaders[ext] = ExtractTextPlugin.extract('style-loader', ori)
  66. } else {
  67. completeStylesheetLoaders[ext] = 'style-loader!' + ori
  68. }
  69. })
  70. var loaders = loadersByExtension(deepExtend({}, loadersMap, specialOptions.loaders, completeStylesheetLoaders))
  71. var extraLoaders = (options.module || {} ).loaders
  72. if(Array.isArray(extraLoaders)) {
  73. loaders = loaders.concat(extraLoaders)
  74. delete options.module.loaders
  75. }
  76. var completeConfig = deepExtend({
  77. entry: {},
  78. output: {
  79. path: path.join(__dirname, 'dist'),
  80. publicPath: '/',
  81. filename: '[name].js',
  82. chunkFilename: '[name].js'
  83. },
  84. target: 'web',
  85. // yaml-js has a reference to `fs`, this is a workaround
  86. node: {
  87. fs: 'empty'
  88. },
  89. module: {
  90. loaders: loaders,
  91. },
  92. resolveLoader: {
  93. root: path.join(__dirname, 'node_modules'),
  94. },
  95. externals: {
  96. 'buffertools': true // json-react-schema/deeper depends on buffertools, which fails.
  97. },
  98. resolve: {
  99. root: path.join(__dirname, './src'),
  100. modulesDirectories: ['node_modules'],
  101. extensions: ["", ".web.js", ".js", ".jsx", ".json", ".less"],
  102. packageAlias: 'browser',
  103. alias: {
  104. base: "getbase/src/less/base"
  105. }
  106. },
  107. postcss: function() {
  108. return [autoprefixer]
  109. },
  110. devtool: specialOptions.sourcemaps ? 'cheap-module-source-map' : null,
  111. plugins,
  112. }, options)
  113. return completeConfig
  114. }