Webpack, как кэшировать бюст angular-translate с помощью $ translatePartialLoader? - PullRequest
0 голосов
/ 13 ноября 2018
"webpack": "^2.7.0"

Я пытаюсь добавить хэш в наши файлы переводов, чтобы кэшировать бюст при развертывании. Мне удалось извлечь JSON и добавить хэш и вывести его в папку, и это хорошо с миром.

Но мой нерасширенный json все еще находится там в исходных папках после сборки. Я понимаю, что нам не нужно добавлять загрузчик для json, поскольку в нем уже есть средства для обработки импорта, поэтому мой вопрос заключается в том, как очистить json, который уже был обработан?

моя структура папок выглядит следующим образом

src/
   app/
     module-name/
        /translations
         en.json
         fn.json
     module-name/
        /translations
         en.json
         fn.json
     //ect...

Я использовал CopyWebpackPlugin для получения json и хэша. Может быть, пропущена опция, которая удаляет файлы процесса? или, возможно, я подхожу к этому неправильным путем.

const webpack = require('webpack');
const conf = require('./gulp.conf');
const path = require('path');

const VersionFile = require('webpack-version-file');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const pkg = require('../package.json');
const autoprefixer = require('autoprefixer');

module.exports = {
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        enforce: 'pre'
      },
      {
        test: /\.(css|scss)$/,
        loaders: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader?minimize!resolve-url-loader!sass-loader?sourceMap!postcss-loader'
        })
      },
      {
        test: /\.(jpe?g|png|gif|svg)$/,
        loader: 'file-loader',
        options: {
          regExp: /\/([a-z0-9]+)\/[a-z0-9]+\.json$/,
          name: '[name]-[hash].[ext]'
        }
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: [
          'ng-annotate-loader',
          'babel-loader'
        ]
      },
      {
        test: /\.html$/,
        loaders: [
          'html-loader'
        ]
      }
    ]
  },
  plugins: [
    new webpack.optimize.OccurrenceOrderPlugin(),
    new webpack.NoEmitOnErrorsPlugin(),
    new HtmlWebpackPlugin({
      template: conf.path.src('index.html')
    }),
    new webpack.optimize.UglifyJsPlugin({
      output: {comments: false},
      compress: {unused: true, dead_code: true, warnings: false} // eslint-disable-line camelcase
    }),
    new ExtractTextPlugin('index-[contenthash].css'),
    new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}),
    new webpack.LoaderOptionsPlugin({
      options: {
        postcss: () => [autoprefixer]
      }
    }),
    new webpack.HashedModuleIdsPlugin(),
    new CopyWebpackPlugin([{
      from: 'src/app/**/*.json',
      to: 'translations/[name]-[hash].[ext]'
    }]),
    new VersionFile({
      output: `${conf.paths.dist}/version.txt`,
      verbose: true
    })
  ],
  output: {
    path: path.join(process.cwd(), conf.paths.dist),
    filename: '[name]-[hash].js'
  },
  entry: {
    app: [`./${conf.path.src('app/app.module.js')}`],
    vendor: Object.keys(pkg.dependencies)
  },
  node: {
    fs: 'empty',
    /* eslint-disable camelcase */
    child_process: 'empty'
  }
};

Или, чтобы аналогично задать вопрос, как я могу добавить хэш к файлам json? и следующий код, похоже, ничего не делает.

   {
       test: /\.json$/,
       loader: 'file-loader',
       options: {
         name: '[name]-[hash].[ext]'
       }
   }

example of the translations being in both locations

EDIT:

кажется, что мой загрузчик json не берет файлы перевода, так как они динамически импортируются, например:

  $translateProvider.useLoader('$translatePartialLoader', {
    urlTemplate: 'app/{part}/translations/{lang}.json'
  });

Вы занимаетесь такими делами?

1 Ответ

0 голосов
/ 19 ноября 2018

Основная цель, которую вы пытаетесь сделать, заключается в том, чтобы сообщить браузеру новый файл при выпуске новой версии, и мы можем сделать это довольно легко, не заставляя веб-пакет знать, какие файлы используются.

в настройках вашего веб-пакета добавьте

const pkg = require('../package.json');
//...
new webpack.DefinePlugin({
  __VERSION__: JSON.stringify(pkg.version)
})

и где вы добавляете файлы перевода, это позволяет браузеру узнать, где был новый выпуск, и должен обновить файлы перевода.

$translateProvider.useLoader('$translatePartialLoader', {
   urlTemplate: `app/{part}/translations/{lang}.json?v=${__VERSION__}`
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...