`

[译]webpack官网文档 :指南 -- 9.正式产品的编译

阅读更多

原创翻译,转载请注明出处。 

原文地址:https://webpack.js.org/guides/production-build/

 

这一页解释了怎样使用webpack来做正式产品编译。

 

自动方式

运行webpack –p(等同于:webpack --optimize-minimize --define process.env.NODE_ENV="'production'"),它会执行以下的步骤:

  • 使用UglifyJsPlugin压缩
  • 运行LoaderOptionsPlugin
  • 设定节点环境变量

压缩

webpack自带UglifyJsPlugin,它运行UglifyJS来压缩输出文件。这个插件支持所有的UglifyJS选项。在命令行指定--optimize-minimize,就会添加下面的配置:

// webpack.config.js
const webpack =require('webpack');
 
module.exports ={
  /*...*/
  plugins:[
    newwebpack.optimize.UglifyJsPlugin({
      sourceMap: options.devtool &&(options.devtool.indexOf("sourcemap")>=0|| options.devtool.indexOf("source-map")>=0)
    })
  ]
};

 

因此依据devtool的选项,会生成Source Maps。

 

Source Maps

我们鼓励在产品里可用Source Maps。它在调试和基准测试的时候非常有帮助。webpack可以在包文件里或者在单独的文件里生成行内Source Maps

在你的配置里,使用devtool对象来设定Source Map的类型。我们目前支持7Source Maps类型。你可以在配置相关的文档里找到找到更多的相关信息。

 

节点环境变量

运行 webpack –p (或者--define process.env.NODE_ENV="'production'"),就会以下面的方式调用DefinePlugin

// webpack.config.js
const webpack =require('webpack');
 
module.exports ={
  /*...*/
  plugins:[
    newwebpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ]
};

 

 

DefinePlugin在原代码里执行查找-替换操作。任何被引入代码里的process.env.NODE_ENV都被替换成“production”。因此,像if (process.env.NODE_ENV !== 'production') console.log('...')的检查都会被处理为if (false) console.log('...'),最后使用UglifyJS就把它们剔除掉了。

 

手动方式:为webpack配置多个环境

当我们需要为不同的环境准备不同配置的话,最简单的方式就是为每一个环境写一个独立的js文件。

dev.js

module.exports =function(env){
  return{
    devtool:'cheap-module-source-map',
    output:{
        path: path.join(__dirname,'/../dist/assets'),
        filename:'[name].bundle.js',
        publicPath: publicPath,
        sourceMapFilename:'[name].map'
    },
    devServer:{
        port:7777,
        host:'localhost',
        historyApiFallback:true,
        noInfo:false,
        stats:'minimal',
        publicPath: publicPath
    }
  }
}

 

prod.js

module.exports =function(env){
  return{
    output:{
        path: path.join(__dirname,'/../dist/assets'),
        filename:'[name].bundle.js',
        publicPath: publicPath,
        sourceMapFilename:'[name].map'
    },
    plugins:[
        newwebpack.LoaderOptionsPlugin({
            minimize:true,
            debug:false
        }),
        newwebpack.optimize.UglifyJsPlugin({
            beautify:false,
            mangle:{
                screw_ie8:true,
                keep_fnames:true
            },
            compress:{
                screw_ie8:true
            },
            comments:false
        })
    ]
  }
}

 

webpack.config.js里添加下面的代码:

functionbuildConfig(env){
  returnrequire('./config/'+ env +'.js')(env)
}
 
module.exports = buildConfig;

 

并且在package.json里,使用webpack来编译应用的时候,代码像这样:

"build:dev":"webpack --env=dev --progress --profile --colors",
"build:dist":"webpack --env=prod --progress --profile --colors",

 

你可以看到我们给webpack.config.js文件传递了一个环境变量。在webpack.config.js文件里我们使用了一个简单的开关,根据传递过来的环境变量调用正确的文件,来进行编译。

一个更好的方法是有一个基础的配置文件,把所有的共同功能都放进去,然后再配置环境特定的文件,使用’webpack-merge’就可以简单的合并它们。这样可以避免代码重复。例如,你可以把解析jstspngjpegjson等等放到下面这样的共通配置里:

base.js

module.exports =function(){
    return{
        entry:{
            'polyfills':'./src/polyfills.ts',
            'vendor':'./src/vendor.ts',
            'main':'./src/main.ts'
 
        },
        output:{
            path: path.join(__dirname,'/../dist/assets'),
            filename:'[name].bundle.js',
            publicPath: publicPath,
            sourceMapFilename:'[name].map'
        },
        resolve:{
            extensions:['.ts','.js','.json'],
            modules:[path.join(__dirname,'src'),'node_modules']
 
        },
        module:{
            rules:[{
                test:/\.ts$/,
                use:[
                    'awesome-typescript-loader',
                    'angular2-template-loader'
                ],
                exclude:[/\.(spec|e2e)\.ts$/]
            },{
                test:/\.css$/,
                use:['to-string-loader','css-loader']
            },{
                test:/\.(jpg|png|gif)$/,
                use:'file-loader'
            },{
                test:/\.(woff|woff2|eot|ttf|svg)$/,
                use:{
                  loader:'url-loader',
                  options:{
                    limit:100000
                  }
                }
            }],
        },
        plugins:[
            newForkCheckerPlugin(),
 
            newwebpack.optimize.CommonsChunkPlugin({
                name:['polyfills','vendor'].reverse()
            }),
            newHtmlWebpackPlugin({
                template:'src/index.html',
                chunksSortMode:'dependency'
            })
        ],
    };
}

 

 

然后用’webpack-merge’把基础配置和一个环境特定配置合并到一起。让我们看看一个合并产品文件的例子,像上面说的,用’webpack-merge’把基础文件合并到一起:

prod.js(更新后)

const webpackMerge =require('webpack-merge');
 
const commonConfig =require('./base.js');
 
module.exports =function(env){
    returnwebpackMerge(commonConfig(),{
        plugins:[
            newwebpack.LoaderOptionsPlugin({
                minimize:true,
                debug:false
            }),
            newwebpack.DefinePlugin({
                'process.env':{
                    'NODE_ENV': JSON.stringify('production')
                }
            }),
            newwebpack.optimize.UglifyJsPlugin({
                beautify:false,
                mangle:{
                    screw_ie8:true,
                    keep_fnames:true
                },
                compress:{
                    screw_ie8:true
                },
                comments:false
            })
        ]
    })
}

 

你会发现在我们的prod.js文件里有三个主要更新点。

  • 用‘webpack-merge'合并'base.js'
  • 我们已经把output移到'base.js'里。强调一点,我们重构'prod.js',把output属性移到共通配置文件'base.js'里,它贯穿于所有的环境。
  • 我们用'DefinePlugin'把'process.env.NODE_ENV'定义为'production'。现在当我们为产品环境编译应用的时候,'process.env.NODE_ENV'的值是'production'将贯穿于整个应用。同样我们可以为每个环境管理各种变量。

 

你自己决定把那些功能定义为横跨所有环境。我们只是演示了在编译应用时一些典型的可以横跨所有环境的功能。

 

-- End --

 

分享到:
评论

相关推荐

    compile-node-sass-0.0.3.zip

    【压缩包子文件的文件名称列表】中的`README.MD`通常包含了项目的基本信息、使用指南、安装步骤等,是理解项目的重要文档。而`node_modules`是Node.js项目的依赖库目录,其中包含`node-sass`模块以及其他可能的依赖...

    webpack 入门

    - **插件系统**:Webpack 提供了一个强大的插件系统,允许开发者扩展其功能,比如优化输出文件、实时编译和热替换等。 #### 三、模块系统与Webpack的关系 **模块系统** 主要涉及模块的定义、依赖管理和导出机制。...

    Laravel开发-laravel-kraken .zip.zip

    1. **Laravel 文档**:官方文档是学习 Laravel 的最佳资源,涵盖了从入门到高级的全面教程。 2. **社区与资源**:Laracasts 提供丰富的视频教程,Stack Overflow 和 Laravel.io 社区可以解决开发中的疑问。 3. **...

    WX-CLI-源码.rar

    2. **构建脚本**:如 `build.js` 或 `webpack.config.js`,这些脚本定义了如何将源代码编译成可以在微信小程序平台上运行的格式。 3. **配置文件**:如 `project.config.json`,它包含了项目的基本配置信息,如项目...

    itcast-dashboard-generate.zip

    8. 构建工具:如Webpack或Gulp,用于编译和打包前端资源。 9. 测试框架:如Jest(JavaScript)、PyTest(Python),用于编写和执行测试用例。 10. 部署:可能包含Dockerfile,用于容器化部署。 11. 配置管理:如....

    webpack 中文指南

    - **官方文档**:[Webpack官网](https://webpack.js.org/) - **中文指南**:[Webpack中文指南](https://zhcn.webpack.js.org/) - **社区资源**:GitHub、Stack Overflow等社区讨论。 ### 结语 Webpack作为一个强大...

    vue-demo-pl-table.zip

    9. **README.md**: 这是一个Markdown格式的文件,通常用来介绍项目的基本信息、安装指南、使用方法等,对于理解和使用项目非常有帮助。 10. **public** 和 **src** 目录:在Vue.js项目中,`public`目录下的文件会被...

    前端项目-tui-calendar.zip

    这个组件是TOAST UI系列产品的一部分,它为Web应用提供了灵活且功能丰富的日历功能。 【描述】"前端项目-tui-calendar"指的是一个专门用于构建Web界面的日期和时间管理工具,它可以帮助开发者在网页上实现各种日历...

    s-ui-component.rar

    7. **构建脚本**:如Gulp、Webpack或npm脚本,用于编译、打包和优化组件。 低代码与自定义UI组件库的结合意味着开发者可以通过简单地拖放和配置这些预先设计和编码的组件,快速构建用户界面,而不必从零开始编写每...

    boss-driver-school-h5.zip

    9. `date-fns日期工具.md` - 这可能是关于 date-fns 库的文档,date-fns 是一个轻量级的 JavaScript 日期库,提供了丰富的日期操作函数,可以与 TypeScript 集成使用,提升日期处理的效率和准确性。 10. `README.md...

    viewer-snap-源码.rar

    - 项目可能使用Gradle、Maven(Java)、Webpack或Rollup(JavaScript)等构建工具,进行代码编译、依赖管理、打包等工作。 - 配置文件如`build.gradle`或`package.json`会提供编译和打包的细节。 8. **文档**: -...

    front-end-canteen-master.rar

    10. **README文档**:解释项目目的、安装步骤、运行指南等,帮助其他开发者快速上手。 总的来说,通过研究这个项目,开发者可以学习到前端开发的多个方面,包括但不限于项目结构、代码规范、性能优化、错误处理等,...

    renren-generator-master.zip

    根据提供的文件名列表,我们只有一个条目:"renren-generator-master",这可能是指解压后的文件夹名称,里面包含的可能是该"renren-generator"项目的源代码、配置文件、文档等资源。通常,这样的项目结构可能包括...

    前端开源库-maptalks-build-helpers.zip

    9. **构建工具**:可能会有对Webpack、Babel、Rollup等构建工具的配置和依赖,这些工具负责将源码打包成可部署的JavaScript文件。 10. **优化和压缩**:在构建过程中,代码可能会通过Terser或其他工具进行混淆和...

    operamasks-ui-master.zip

    5. `docs` 文件夹:项目文档,包括API参考、开发指南等。 6. `package.json`:项目依赖和配置信息。 7. `.gitignore`:定义了在Git版本控制中忽略的文件或文件夹。 8. `.npmignore`:定义了在npm发布时忽略的文件或...

    js-conditional-compile-loader-1.0.15.tgz

    总的来说,`js-conditional-compile-loader-1.0.15.tgz`提供了一种解决方案,使得开发者可以在webpack构建流程中方便地进行条件编译,解决了官方包的潜在问题,提高了开发效率和代码质量。对于依赖此功能的项目来说...

    前端开源库-hot-builder-cg.zip

    "前端开源库-hot-builder-cg.zip" 是一个包含前端开发工具和库的压缩包,它可能为开发者提供了一种高效构建、热加载和持续...如果你想要深入了解和使用这个工具,你需要解压文件,阅读文档,并根据指南进行配置和运行。

    argon-design-system-源码.rar

    6. **编译和构建**:如果源码包含构建流程,如Webpack或Gulp,按照说明进行编译和优化。 由于具体的技术栈和源码内容未知,以上分析是基于常见设计系统的常规构成。要获取更详细的信息,需要解压并探索源码本身。...

    webpack5 文档资料

    9. **性能提升**:Webpack 5 提供了更好的性能优化,比如零配置的 Tree Shaking(移除未使用的代码),这得益于对 ES 模块更好的支持。此外,更大的块大小限制允许更少的 HTTP 请求,从而提高页面加载速度。 10. **...

    前端项目-lg-autoplay.zip

    在IT行业中,前端开发是构建Web应用程序不可或缺的一部分,它涉及到用户与网站互动的界面设计和实现。本项目“前端项目-lg-autoplay.zip”专注于LightGallery的自动播放功能,这是一个非常实用的JavaScript库,用于...

Global site tag (gtag.js) - Google Analytics