【问题标题】:webpack use closure-webpack-plugin instead of google-closure-compilerwebpack 使用closure-webpack-plugin 而不是 google-closure-compiler
【发布时间】:2019-09-27 01:28:12
【问题描述】:

在 webpack v4 之前,没有提供 closure-webpack-plugin 支持,所以我们不得不使用 google-closure-compiler。我不确定如何使用该插件。

文件:buildSecondary.js


var ClosureCompiler = require('google-closure-compiler').compiler;

function runClosueCompiler(){
    if(!flags.compile)
      return;

    console.log('Compiling');

    var fs = require('fs');

    var closureCompiler = new ClosureCompiler({
      js: 'folder/filename.js',
      compilation_level: 'ADVANCED'
    });

    var compilerProcess = closureCompiler.run(function(exitCode, stdOut, stdErr) {
      //compilation complete 
      if(exitCode === 0){
        console.log('successful');
        fs.writeFileSync('folder/filename.min.js', stdOut);
        console.log('compiled file in folder/filename.min.js');
      }else{
        console.log('complilation exited with code '+exitCode);
        console.error(stdErr);
      }
    });
    console.log('Closure compiler executed successfully');  
}


setTimeout(function () {
  console.log('appending module.exports into file/filename.js (import fix)');
  var fs = require('fs');
  var filedata = [
    fs.readFileSync(__dirname + '/file/filename.js').toString(),
    'if(typeof module !== "undefined")',
    'module.exports = filename;'
  ];

  //append to file export
  fs.writeFileSync(__dirname + '/file/filename.js', filedata.join('\n'));

  console.log('Executing closure compiler');
  runClosureCompiler();
}, 2 * 100);

文件:webpack.config.js


var Webpack = require('webpack');
var path = require('path');
const ClosurePlugin = require('closure-webpack-plugin');
module.exports = {

    entry: './folder/entry_file.js',

    output: {
        path: path.join(__dirname, 'folder'),
        filename: 'filename.js',
    },

    module: {
        rules: [
            {
                // Target Files
                // test: /\.js?$/g,

                // Excluded folders
                exclude: /(node_modules|bower_components)/,

            },
        ]
    },
    optimization: {
        minimize: true,
        minimizer: [
            new ClosurePlugin({ mode: 'STANDARD'} , 
            { compilation_level: "ADVANCED" })
        ]
    },
    plugins: [
        new Webpack.LoaderOptionsPlugin({
            debug: true
        }),


    ],
};  

我不确定应该在 webpack.config.js 中进行哪些更改以构建类似于 buildSecondary.js 的文件。

【问题讨论】:

    标签: webpack google-closure-compiler


    【解决方案1】:

    closure-webpack-plugin has a Webpack v3 version

    我把它和 gulp 一起用,像这样

    webpack.conf.js

    const ClosurePlugin = require('closure-webpack-plugin');
    const webpack = require('webpack');
    const path = require('path');
    
    module.exports = {
      devtool: 'eval-source-map',
      entry: {
        main: './src/global/js/app',
      },
      resolve: {extensions: ['.js']},
      output: {
        filename: 'js/[name].min.js',
        path: path.resolve(__dirname, 'src', 'static')
      },
      plugins: [
        new ClosurePlugin({
          mode: 'NONE',
          closureLibraryBase:
              require.resolve('google-closure-library/closure/goog/base'),
          deps: [
            require.resolve('google-closure-library/closure/goog/deps'),
            './.tmp/deps.js',
          ],
          extraDeps
        },
            devFlags),
      ],
    };
    

    gulpfile.js(部分)

    const gulp = require('gulp');
    const webpackConfig = require('../webpack.config.js');
    const closureDeps = require('gulp-google-closure-deps');
    // You'll want to connect isDevMode with your build system.
    const isDevMode = true; 
    const closureDir = path.dirname(
        require.resolve('google-closure-library/closure/goog/base'));
    
    gulp.task('js', ['deps'], () => {
      // If we are in dev mode, do the uncompiled setup.
      if (isDevMode) {
        return gulp.src('')   // Source files have been configred in Webpack
            .pipe(webpack(webpackConfig))
            .pipe(gulp.dest('.'));  // Output files to public folder
      }
    });
    gulp.task('deps', function() {
      return gulp.src(['src/**/js/**/*.js'])
          .pipe(closureDeps({
            'closurePath': closureDir,
            prefix: '../../../..',
            baseDir: '.'
          }))
          .pipe(rename('deps.js'))
          .pipe(gulp.dest('.tmp'));
    });
    

    【讨论】:

    • 感谢您的回答,虽然我有一些问题。如何在 webpack config 中使用两个构建,一个用于缩小版本,另一个用于文件中的普通版本,以及与此问题相关的 gulpFile 的用途是什么?
    • @HimanshuJotwani gulp 文件正在生成您的 deps.js,这是以未编译形式使用此 javascript 的要求。 “webpack 中的两个构建”听起来像是一个单独的问题......
    • 感谢您的快速回复,虽然不是我问题的完美答案,但得到了要点!
    【解决方案2】:

    让webpack识别goog.require、goog.provide、goog.module和goog.declareModuleId,你可以试试这个google-closure-library-webpack-plugin。

    【讨论】:

    • 如果链接损坏,仅链接答案将无济于事 - 欢迎来到 Stack Overflow :)
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2011-05-12
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多