ES6+轉ES5(webpack+babel、指定多個js文件、自動注入)


  接續上篇ES6+轉ES5,本篇將使用webpack和babel將多個不同目錄下指定的多個ES6+語法的js文件編譯為ES5,並將編譯后的文件配置注入對應的html文件。
  所需環境node、npm、設置淘寶鏡像請參考上篇進行安裝,地址:https://www.cnblogs.com/puyongsong/p/12036090.html

一、新建項目,目錄如下

二、執行命令初始化項目

  cnpm init -y
  執行成功后會生成文件:package.json

三、執行命令安裝webpack

  cnpm install webpack --save-dev
  (有個坑)在webpack3中,webpack本身和它的CLI以前都是在同一個包中,但在第4版中,兩者已分開管理,所以要單獨安裝其腳手架。
  執行命令安裝webpack-cli
  cnpm install webpack-cli --save-dev

四、執行命令安裝以下3個用於處理js的包

  cnpm install --save-dev babel-loader @babel/core @babel/preset-env
  babel-loader:對使用了ES2015+語法的.js文件進行處理。
  babel-core:提供一系列api。當webpack使用babel-loader處理文件時,babel-loader就調用了babel-core的api。
  babel-preset-env:告訴babel使用哪種轉碼規則進行文件處理。babel有幾種規則都可以實現對ES6語法的轉碼,如babel-preset-es2015、babel-preset-latest、babel-preset-env,不過官方現已建議采用babel-preset-env。

五、執行命令安裝全局墊片插件:

  cnpm install babel-polyfill --save-dev

六、執行命令安裝局部墊片插件:

  cnpm install @babel/runtime --save-dev
  cnpm install @babel/plugin-transform-runtime --save-dev
  墊片:Babel默認只轉換新的JavaScript句法(syntax),而不轉換新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法(比如Object.assign)都不會轉碼。舉例來說,ES6在Array對象上新增了Array.from方法。Babel就不會轉碼這個方法。如果想讓這個方法運行,必須使用babel-polyfill,為當前環境提供一個墊片。

七、根目錄下新建文件:webpack.config.js

  這個js配置文件的注意事項我都寫上了注釋,后面我會將其全部內容貼上來。

八、根目錄下建一個.babelrc文件,內容為

{
    "presets": [
        ["@babel/preset-env", {
            "targets": {
                "browsers": ["> 1%", "last 2 versions"]
            }
        }]
    ],
    "plugins": ["@babel/transform-runtime"]
}

  意思是打包后的代碼要支持1%以上的瀏覽器並支持瀏覽器的上2個版本
  此時執行命令webpack就可以了

九、想要配置為html文件自動注入所以生成的包還需要安裝以下插件

  執行命令安裝html-webpack-plugin插件
  cnpm install html-webpack-plugin --save-dev
  安裝完成后執行webpack即可
  注意:如果webpack打包時報錯Cannot find module 'webpack/lib/node/NodeTemplatePlugin'
  解決辦法
  執行命令cnpm link webpack --save-dev
  然后在執行webpack就可以了
  附上最后生成文件后的目錄結構圖:

附上webpack.config.js全部內容 

//為了使用插件,需要將require()其添加到plugins陣列中。使用new運算符調用插件來創建插件的實例。
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 用於訪問內置插件
const path = require('path');
module.exports = {
    entry: { //入口配置
        index: './src/index.js',
        ctrl: './ctrls/ctrl.js'
    },
    // 這里[]里的name就是app和search也就是entry里的key值 
    //  這里[hash:5]會隨機生成一個版本號作為你的打包js版本 
    //  建議最后一次打包才加上.[hash:5] 否則每次打包都同一個文件都會生成新的版本號不同的文件
    output: { //出口配置
        // filename: '[name].[hash:5].js',
        filename: '[name].js',
        path: __dirname + '/dist' // 生成新文件的地址
    },
    module: {
        rules: [{
            test: /(\.jsx|\.js)$/, // 處理以.jsx或.js結尾的文件
            use: {
                loader: "babel-loader", // 用babel-loader處理
                options: {
                    "presets": [
                        ["@babel/preset-env", {
                            "targets": {
                                "browsers": ["> 1%", "last 2 versions"]
                            }
                        }]
                    ]
                }
            }
        }]
    },
    //html-webpack-plugin生成器通過自動注入所有生成的包為應用程序生成HTML文件
    plugins: [
        new HtmlWebpackPlugin({ // 地址為output對應的path地址dist
            template: './src/index.html', //處理模板
            filename: '../index.html' //生成模板
            // 無chunks參數默認全部注入
        }), new HtmlWebpackPlugin({
            template: './src/a.html', //處理模板
            filename: '../views/view1.html', //生成模板
            chunks: ['index'] // 只引入index.js
        })
    ]
}

共勉,望鞭策!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM