webpack-实战

Posted web前端每日干货

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack-实战相关的知识,希望对你有一定的参考价值。

1. Babel 是一个  javascript 编译器,能将 ES6 代码转为 ES5 代码,让我们使用最新的语言特性而不用担心兼容性问题。

.babelrc 文件中读取配置文件。


解读 scss

module.exports = {

  module: {

    rules: [

      {

        // 增加对 SCSS 文件的支持

        test: /\.scss/,

        // SCSS 文件的处理顺序为先 sass-loader 再 css-loader 再 style-loader

        use: ['style-loader''css-loader''sass-loader'],

      },

    ]

  },

};

1. 通过 sass-loader 把 SCSS 源码转换为 CSS 代码,再把 CSS 代码交给 css-loader 去处理。

2. css-loader 会找出 CSS 代码中的 @import 和 url() 这样的导入语句,告诉 Webpack 依赖这些资源。同时还支持 CSS Modules、压缩 CSS 等功能。处理完后再把结果交给 style-loader 去处理。

3. style-loader 会把 CSS 代码转换成字符串后,注入到 JavaScript 代码中去,通过 JavaScript 去给 DOM 增加样式。如果你想把 CSS 代码提取到一个单独的文件而不是和 JavaScript 混在一起,可以使用1-5 使用Plugin 中介绍过的 ExtractTextPlugin。



possCss 给 CSS 自动加前缀,增加各浏览器的兼容性

其中的 postcss-cssnext 插件可以让你使用下一代 CSS 语法编写代码,再通过 PostCSS 转换成目前的浏览器可识别的 CSS,并且该插件还包含给 CSS 自动加前缀的功能。


module.exports = {

  module: {

    rules: [

      {

        // 使用 PostCSS 处理 CSS 文件

        test: /\.css/,

        use: ['style-loader''css-loader''postcss-loader'],

      },

    ]

  },

};


使用react 

const path = require('path');

module.exports = {

  // TS 执行入口文件

  entry: './main',

  output: {

    filename: 'bundle.js',

    path: path.resolve(__dirname, './dist'),

  },

  resolve: {

    // 先尝试 ts,tsx 后缀的 TypeScript 源码文件 

    extensions: ['.ts''.tsx''.js',] 

  },
 module: {

    rules: [

      {

        // 同时匹配 ts,tsx 后缀的 TypeScript 源码文件 

        test: /\.tsx?$/,

        loader: 'awesome-typescript-loader'

      }

    ]

  },

  devtool: 'source-map',// 输出 Source Map 方便在浏览器里调试 TypeScript 代码

};

使用vue

module: {

  rules: [

    {

      test: /\.vue$/,

      use: ['vue-loader'],

    },

  ]

}


总结:

   

const path = require('path');

const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin');

const ExtractTextPlugin = require('extract-text-webpack-plugin');

const DefinePlugin = require('webpack/lib/DefinePlugin');

const { WebPlugin } = require('web-webpack-plugin');



module.exports = {

  entry: {

    app'./main.js'// app 的 JavaScript 执行入口文件
  },

  output: {

    filename'[name]_[chunkhash:8].js',// 给输出的文件名称加上 Hash 值

    path: path.resolve(__dirname, './dist'),

  },

  module: {

    rules: [

      {

        test/\.js$/,

        use: ['babel-loader'],

        // 排除 node_modules 目录下的文件,

        // 该目录下的文件都是采用的 ES5 语法,没必要再通过 Babel 去转换

        exclude: path.resolve(__dirname, 'node_modules'),

      },
 {

        test/\.css/,// 增加对 CSS 文件的支持

        // 提取出 Chunk 中的 CSS 代码到单独的文件中

        use: ExtractTextPlugin.extract({

          use: ['css-loader?minimize'// 压缩 CSS 代码

        }),

      },

    ]
 plugins: [

    // 使用本文的主角 WebPlugin,一个 WebPlugin 对应一个 html 文件

    new WebPlugin({

      template'./template.html'// HTML 模版文件所在的文件路径

      filename: 'index.html' // 输出的 HTML 的文件名称

    }),

    new ExtractTextPlugin({

      filename`[name]_[contenthash:8].css`,// 给输出的 CSS 文件名称加上 Hash 值

    }),

    new DefinePlugin({

      // 定义 NODE_ENV 环境变量为 production,以去除源码中只有开发时才需要的部分

  },
'process.env': {

        NODE_ENVJSON.stringify('production')

      }

    }),

    // 压缩输出的 JavaScript 代码

    new UglifyJsPlugin({

      // 最紧凑的输出

      beautify: false,

      // 删除所有的注释

      comments: false,

      compress: {

        // 在UglifyJs删除没有用到的代码时不输出警告

        warnings: false,

        // 删除所有的 `console` 语句,可以兼容ie浏览器

        drop_console: true,

        // 内嵌定义了但是只用到一次的变量

        collapse_vars: true,

        // 提取出出现多次但是没有定义成变量去引用的静态值

        reduce_vars: true,

      }

    }),

  ],

}

1.增加对 CSS 文件的支持,提取出 Chunk 中的 CSS 代码到单独的文件中,压缩 CSS 文件;

2.定义 NODE_ENV 环境变量为 production,以去除源码中只有开发时才需要的部分;

3.给输出的文件名称加上 Hash 值;

4.压缩输出的 JavaScript 代码。


以上是关于webpack-实战的主要内容,如果未能解决你的问题,请参考以下文章

webpack 多页应用架构系列实战

webpack实战之手写一个loader和plugin

webpack4常用片段

webpack 零基础到工程实战

(21/24) webpack实战技巧:webpack对三方类库的优化操作

从基础到实战 手把手带你掌握新版Webpack4.0