webpack-stream详解 gulp中编译js文件 babel-loader string-loader-程序员宅基地

技术标签: gulp  webpack  构建工具  

ES6及以上版本的 js 文件在一些低版本浏览器上不能执行,所以当项目开发完成后,我们需要对 js 文件进行编译,将ES6+的语法转译为 ES5。这里我们使用gulp的webpack-stream插件来对js文件进行打包。解决js转译的问题需要用到babel,我们在这里使用webpack 的 babel-loader。具体操作往下看。

webpack-stream

先来认识一下webpack-stream,我们都知道webpack的功能非常强大,但是在,批量式处理方面,依然是gulp更胜一筹,通过使用webpack-stream,可以将webpack作为‘流’运行,集成到gulp中。

1、安装

npm install --save-dev webpack-stream
#或者使用yarn安装
yarn add webpack-stream -D

2、webpack.config.js

一个简单的 webpack.config.js文件内容如下:

module.exports = {
    
	mode: "development",
    devtool:"inline-source-map",//调试工具显示
    entry: "./src/js/app.js",
    output: {
    
        path: "/home/dev/",
        filename: "app.js"
    },
    module:{
    } //下面有该内容的详细介绍
}

webpack的配置项:

  • mode,设置环境模式,告知 webpack 使用相应模式的内置优化;
    • development,表示开发环境;
    • production,表示生产环境;
  • devtool,源映射,可以设置在浏览器控制台中代码的显示方式;
    • 默认在控制台显示编译后的代码内容;
    • source-map,在控制台显示源代码;
    • inline-source-map,表示将源映射内联到文件中;
  • entry,入口文件,可以配置多个入口点;
    • entry: './path/to/my/entry/file.js',表示只有一个入口文件;
    • entry:{pageOne:'./src/pageOne/index.js',pageTwo:'./src/pageTwo/index.js'},设置多页面应用程序;
  • output,导出文件的路径,即使存在多个入口,也只能指定一个输出配置。
    • path,目标输出目录,是一个绝对路径;
    • filename,输出文件的文件名,当存在多个入口文件时,使用 [name]对应entry 中的key;
  • module,模块,通过 loader 可以支持各种语言和预处理器编写模块;

3、导入gulpfile.js

将webpack.config.js文件导入gulpfile.js中:

const {
    src,series,dest} = require("gulp");
const webpack = require("webpack-stream");
const webpackConfig = require ("./webpack.config.js");
const path = require("path");

function compileJs() {
    
	return src("./src/js/**/*.js")
	.pipe(webpackStream(webpackConfig))
	.pipe(dest("./dev/"))
}
exports.default = series(compileJs)

在终端中直接输入gulp启动服务,就可以看到打包好的文件了。

现在我们可以实现使用webpack-stream对js文件进行打包输出,但是如果在 js 中,我们使用的是 ES2015+ 的语法,会出现低版本浏览器不兼容的问题,所以我们需要对打包的文件进行编译,这里用到下面两个插件。

babel-loader

它的作用是加载 ES2015+ 代码,然后使用 Babel 转译为 ES5。

1、安装

npm install babel-loader @babel/core @babel/preset-env  @babel/plugin-transform-runtime @babel/runtime --save-dev
//或者使用yarn安装
yarn add babel-loader @babel/core @babel/preset-env  @babel/plugin-transform-runtime @babel/runtime -D

2、用法

在 webpack 配置对象中,需要添加 babel-loader 到 module 的 loaders 列表中,可以使用 options 属性来给 loader 传递选项,像下面这样:

module: {
    
    rules: [
        {
    
            test: /\.js$/, //需要编译的文件
            exclude: /node_modules/, //排除 node_modules目录
            use: {
    
                loader: "babel-loader", //loader名称
                options: {
    	//配置
                    presets: ['@babel/preset-env'], //预设
                    plugins: ['@babel/plugin-transform-runtime']//插件
                }
            }
        }
    ]
}

3、注意事项

  • 确保转译尽可能少的文件。你可能使用 /.js$/ 来匹配,这样也许会去转译 node_modules 目录或者其他不需要的源代码。为了提高 babel-loader 的速度,需要使用exclude,排除 node_modules目录;
  • 引入 babel-plugin-transform-runtime ,使所有辅助代码从这里引用。它可以避免重复引入,减小代码体积;

点击查看关于babel的详细介绍。

string-loader

它的作用是将资源文件转换为字符串。可以搭配 art-template 模板引擎一起使用,提高开发效率。

例如当我们在js文件中引入下面这个html文件时,会自动将这个html文件换成字符串。

import ItemTpl from "../../views/position/position-item.html";

console.log(ItemTpl); //“<html>......</html>”

1、安装

npm install string-loader --save-dev
//或者使用yarn来安装
yarn add string-loader -D

2、用法

将html转换为字符串模板:

module: {
    
    rules: [
        {
    
          test:/\.html$/,
          loader:"string-loader"
         }
    ]
}

将json转换为字符串模板:

module: {
    
    rules: [
        {
    
          test:/\.json$/,
          loader:"string-loader"
         }
    ]
}

gulp编译js的完整代码

到此为止,通过使用 babel-loader 、string-loader 这两个插件,我们可以将js文件转译为兼容任何浏览器的ES5语法。

gulpfile.js文件如下:

const {
    src,series,dest} = require("gulp");
const concat = require("gulp-concat");
const webpackStream = require("webpack-stream");
const path = require("path");

function compileJs() {
    
	return src("./src/js/**/*.js")
	   .pipe(webpackStream({
    
	       mode: "development",
	       devtool:"inline-source-map",
	       entry: {
    
	           main:"./src/js/app.js",
	           detail:"./src/js/detail.js"
	       },
	       output: {
    
	           path: path.resolve(__dirname, "./dev/"),
	           filename: "[name].js"
	       },
	       module: {
    
	           rules: [
	               {
    
	                   test: /\.js$/,
	                   exclude: /node_modules/,
	                   use: {
    
	                       loader: "babel-loader",
	                       options: {
    
	                           presets: ['@babel/preset-env'], //预设
	                           plugins: ['@babel/plugin-transform-runtime']
	                       }
	                   }
	               },
	               {
    
	                   test:/\.html$/,
	                   loader:"string-loader"
	               }
	           ]
	       }
	   }))
	   .pipe(dest("./dev/"))
}

exports.default = series(compileJs);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Charissa2017/article/details/104873981

智能推荐

优思学院:质量管理7原则、8大要点_组织需要管理其与有关的 的关系-程序员宅基地

文章浏览阅读98次。在质量管理的道路上,没有捷径可循。质量管理是一项需要不断积累经验和智慧的长期过程,其中涵盖了七大关键原则,这些原则是组织在质量管理方面取得持续成功的基石。_组织需要管理其与有关的 的关系

friendly java_关于Java的权限修饰符(public,private,protected,默认friendly)-程序员宅基地

文章浏览阅读538次。以前对访问修饰符总是模棱两可,让自己仔细解释也是经常说不很清楚.这次要彻底的搞清楚.现在总结如下:一.概括总结 各个访问修饰符对不同包及其子类,非子类的访问权限Java访问权限修饰符包含四个:public,protected,friendly,private;但是,friendly在java中并没有显示的声明,成员变量和方法默认情况下就是friendly权限。现在把它们的访问权限表示出来:(目前展..._访问修饰符friendly

c++ timer-程序员宅基地

文章浏览阅读442次。https://www.cnblogs.com/yunlambert/p/10226468.html#include <iostream>#include <thread>#include <chrono>#include<functional>using namespace std;class Timer { bool clear = false;public: template<typename T> void set_c++ timer

数据结构_顺序查找(C语言)_数据结构顺序查找c语言代码-程序员宅基地

文章浏览阅读1.4w次,点赞29次,收藏172次。从表的一端开始,依次将表中的关键字和给定的值进行比较,若表中的关键字和给定的值相等,则查找成功,反之查找失败。_数据结构顺序查找c语言代码

如何打开虚拟机服务器,虚拟机怎么打开ssh服务器-程序员宅基地

文章浏览阅读1.1k次。虚拟机怎么打开ssh服务器 内容精选换一换本手册介绍如何安装Mind Studio以及安装过程中的故障处理方法。Mind Studio只能安装在Ubuntu服务器上,可以在Ubuntu服务器上使用原生桌面自带的终端gnome-terminal进行安装,也可以在Windows服务器上通过SSH登录到Ubuntu服务器进行安装,因为Mind Studio是一款GUI程序,所以在Win本节操作介绍在Wi..._虚拟机如何进入ssh

【雕爷学编程】Arduino 手册之三角函数 sin()_arduino sin-程序员宅基地

文章浏览阅读928次,点赞3次,收藏11次。sin() 是 Arduino 数学库中的一个函数,它的作用是计算一个角度的正弦值。Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。可以使用 sin() 函数和反正弦函数 asin() 来计算每秒钟物体沿着圆周移动的弧长对应的弧度值,然后除以 PI 得到相对于圆心的角度变化。在使用sin()函数计算角度的正弦值时,确保输入的角度值在正确的范围内。_arduino sin

随便推点

哈工大操作系统实验三(整理自用)-程序员宅基地

文章浏览阅读1.2k次。整理自用,有误烦请指正_操作系统实验三

虚拟声卡(虚拟扬声器和虚拟麦克风)应用之音频回环(Virtual Audio Cable)-程序员宅基地

文章浏览阅读1.9k次,点赞22次,收藏29次。首先在了解Virtual Audio Cable音频回环技术之前,我们先介绍几个基础的概念:虚拟声卡:是一种硬件虚拟化技术;基于软件技术虚拟出麦克风或者虚拟扬声器硬件,提供给上层用户程序使用虚拟麦克风和扬声器,例如通过给虚拟扬声器喂送音频数据实现麦克风录音效果。音频回环:跟我们网络通信的回环地址(127.0.0.1)通信一样;所谓的音频回环是内核驱动层直接将麦克风/扬声器的声音直接提交给扬声器/麦克风,可以达到数据硬件层的直接转发的功能。_virtual audio cable

python飞机大战源代码-python飞机大战源码和素材-程序员宅基地

文章浏览阅读965次。1 importpygame2 from plane_sprites import *345 classPlaneGame(object):6 """飞机大战主游戏"""78 def __init__(self):9 print("游戏初始化")1011 #1.创建游戏的..._python飞机大战源代码

eNSP配置OSPF实验_ospf enable 1 area 0.0.0.0-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏22次。实验工具eNSP (AR1220)实验拓扑配置PC110.1.1.2255.255.255.010.1.1.1PC210.1.4.2255.255.255.010.1.4.1R4undo terminal monitor #配置前最好关掉这个终端监控,否则一直弹信息影响操作syssysname R4interface LoopBack0 ip address 10.1.127.1 255.255.255.255 router id _ospf enable 1 area 0.0.0.0

Android wear 2.0发布,完全体 Android Wear 2.0发布-程序员宅基地

文章浏览阅读125次。原标题:完全体 Android Wear 2.0发布 在北京时间今天凌晨的谷歌I/O大会上,谷歌推出了其可穿戴设备操作系统Android Wear的2.0版本,该版本之中最大的特色为允许智能手表脱离智能手机独立运行。在本次Android Wear 2.0更新之中,智能手表将可以通过蓝牙、Wi-Fi甚至移动网络(只要硬件上支持)直接和互联网传输信息,同时此特性也将允许使用Android Wear智能..._android headlines, report: android wear 2.0 will bring android pay to ios.

pyChram导入xlrd库操作xlsx文件报错,解决办法_pycham不支持xlsx-程序员宅基地

文章浏览阅读435次。首先需要命令行输入pip uninstall xlrd 卸载新版本的xlrd,然后输入pip uninstall xlrd==1.2.0,指定安装1.2.0版本的xlrd。pyChram导入xlrd库操作xlsx文件报错:xlrd.biffh.XLRDError: Excel xlsx file;原因是:新版本(2.0.1)的xlrd因安全问题不支持xlsx格式,可以降低xlrd的版本。_pycham不支持xlsx