Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

make-webpack-config.js 4.1 KiB

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