webpack将静态资源压缩语法转义后拷贝至目标文件夹

需求分析

  1. 静态文件要拷贝到目标文件 – copy-webpack-plugin
  2. 将文件压缩 – uglify-es
  3. 将文件语法从ES6/7转义至ES5,使得低版本浏览器可运行

由于 1.2 使用webpack插件即可实现,但是 3 需要进行对应的babel转换,由于要结合copy-webpack-plugin使用,所以要弄明白babel具体转换的原理

Babel转换原理

实现步骤
  1. 解析(parse):将代码字符串解析成抽象语法树,即所谓的 AST
    1. @babel/parser 的 parse 方法
    2. babylon 的 parse 方法 (由于本项目babel-loader等版本较低,所以使用这个方法)
  2. 转换(transform):对 AST 进行处理,在这个阶段可以对 ES6 代码进行相应转换,即转成 ES5 代码
    1. @babel/core 的 transformFromAstSync
    2. babel-code 的 transformFromAst(由于本项目babel-loader等版本较低,所以使用这个方法)
  3. 生成(generate):根据处理后的 AST 再生成代码字符串
    1. @babel/generator 的 generate
    2. babel-generator 的 generate
注意
  • babel使用要匹配版本,都则会报错 ERROR in Plugin/Preset files are not allowed to export objects, only functions
// 这段是官方文档中的,应该是对版本之间的一些要求
webpack 4.x | babel-loader 8.x | babel 7.x
	如果配置里的babel-loader 8.x版本的话对应的babel 就为 7.x
	运行这句:npm install babel-loader @babel/core @babel/preset-env webpack
webpack 4.x | babel-loader 7.x | babel 6.x
	如果配置里的babel-loader 7.x版本的话对应的babel 就为 6.x
	运行这句:npm install babel-loader@7 babel-core babel-preset-env webpack

具体实现

下载相关插件
// 拷贝文件
npm install copy-webpack-plugin --save-dev
// 压缩文件
npm install uglify-es --save-dev
// 语法转移时使用
npm install babylon --save-dev
拷贝并压缩
const CopyWebpackPlugin = require('copy-webpack-plugin')
const UglifyJS = require('uglify-es')

new CopyWebpackPlugin([
    {
      from: path.resolve(__dirname, '../src/static/test/'),
      to: path.resolve(__dirname, '../dist/static/test/'),
      transform: function (content) {
        const sourceCode = content.toString()
        return UglifyJS.minify(sourceCode).code
      }
    }
])
babel转换
const { parse } = require('babylon')
const { transformFromAst } = require('babel-core')

// babel语法转换
function babelTransformCode (sourceCode) {
    const ast = parse(sourceCode)
    const { code } = transformFromAst(ast, sourceCode, {
        babelrc: false,
        presets: [
            ["env", {
                "modules": false,
                "targets": {
                    "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
                }
            }],
            "stage-2"
        ]
    })
    return code
}
使用
new CopyWebpackPlugin([
    {
      from: path.resolve(__dirname, '../src/static/test/'),
      to: path.resolve(__dirname, '../dist/static/test/'),
      transform: function (content) {
        const sourceCode = content.toString()
        const code = babelTransformCode(sourceCode)
        const miniCode = UglifyJS.minify(code).code
        // return code // 转义后代码
        return miniCode // 压缩代码
      }
    }
])

本文参考文章

https://www.babeljs.cn/docs/babel-parser
https://babel.docschina.org/docs/en/6.26.3/babel-generator
https://www.jianshu.com/p/8289a0d30241
https://blog.csdn.net/weixin_39475476/article/details/88044803

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值