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.
 
 
 
 

150 lines
4.0 KiB

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