牛什么的网站建设,成都优化网站关键词,万网域名解析平台,中山市城乡建设局网站选用合适的loader来处理不同的资源和不同的功能#xff0c;以下是一些主流的loader#xff0c;但这并不是全部#xff0c;因为每时每刻都可能有新的loader 发布到 npm上
babel-loader
babe-loader 用来处理ES6并将其编译为ESS#xff0c;它使我们能够在最新的工程中使用最…选用合适的loader来处理不同的资源和不同的功能以下是一些主流的loader但这并不是全部因为每时每刻都可能有新的loader 发布到 npm上
babel-loader
babe-loader 用来处理ES6并将其编译为ESS它使我们能够在最新的工程中使用最新语言特性同时不必特别关注这些特性在不同平台的兼容问题
在安装时推荐使用以下命令:
npm install babel-loader babel/core babel/preset-env在配置 babel-loader 时有一些需要注意的地方。请看下面的例子:
rules:[
{test: /\.js$/,exclude: /node_modules/,use:(loader: babel-loader,options:{cacheDirectory: truepresets: [[env{modules; false,}]]},),
}
],由于babel-loader通常属于对所有JS后缀文件设置的规则所以需要在exclude中添加node_modules否则会令 babel-loader 编译其中所有的模块这将严重拖慢打包的速度并且有可能改变第三方模块的原有行为。
对于babel-loader本身我们添加了cacheDirectory 配置项它会启用缓存机制在重复打包未改变过的模块时防止二次编译同样也会加快打包的速度。cacheDirector可以接收一个字符串类型的路径来作为缓存路径这个值也可以为 true此时其缓存目录会指向 node_modules/.cache/babel-loader
由于babel/preset-env会将ES6 Module转化为CommonJS 的形式这会导致 Webpack中的 tree-shaking 特性失效**babel/preset-env的modules 配置项设置为false会禁用模块语的转化而将ESModule的语法交给 Webpack 本身处理。**
ts-loader
ts-loader 与 babel-loader 的性质类似它是用于连接Webpack 与 Typescript的模块。可使用以下命令进行安装:
npm install ts-loader typescriptWebpack 配置如下:
rules;[{test: /\.ts$/,use:ts-loader,}
],需要注意的是Typescript本身的配置并不在ts-loader 中而是必须要放在工程录下的tsconfig.json中。 通过 Typescript 和 ts-loader我们可以实现代码类型检查。
html-loader
html-loader用于将HTML文件转化为字符串并进行格式化这使得我们可以把一个HTML片段通过JS加载进来
安装命令如下:
npm install html-loaderWebpack配置如下
rules;[{test: /\.html$/,use:html-loader,}
],header.html将会转化为字符串并通过 documentwrite 插人页面中
file-loader
file-loader 用于打包文件类型的资源并返回其 publicPath。 安装命令如下:
npm install file-loaderWebpack配置如下
const path require(path);
module.exports (entry:./app.js,output: {path: path.join(__dirname,dist),filename: bundle.js},module:(rules:[{ test: /\.(png|jpg|gif)$/use:file-loader,}],},
};
4 上面我们对png、jpg、gif这类图片资源使用 file-loader然后就可以在JS中加载图片了。
import avatarImage from ./avatar.jpg;console.log(avatarImage);// c6f482ac9a1905e1d7d22caa909371fc.jpgurl-loader
url-loader 与 fle-loader 作用类似唯一的不同在于用户可以设置一个文件大小阈值当大于该阙傻时与 fle-loader一样返回 publicPath而小于该值时则返回文件base64 形式编码。 安装命令如下:
npm install url-loaderWebpack 配置如下:
rules:[{test:/\.(png|jpg|gif)$/,use:{loader: url-loader,options:{limit: 10240,name: [name].[ext],publicPath: ./assets-path/,}}}
]url-loader 可接收与 file-loader 相同的参数如name和 publicPath 等同时也可以接收一个 limit 参数。
vue-loader
vue-loader 用于处理 vue 组件:
安装命令如下;
npm install vue-loader vue vue-template-compiler css-loaderWebpack配置如下
rules;[{test: /\.vue$/,use:vue-loader,}
],自定义 loader
有时会遇到现有 loader 无法很好满足需求的情况这时就需要我们对其进行修改或者编写新的 loader。如前面代码所演示的一样loader 本身其实非常简单下面就从头实现一个loader
我们将实现一个loader它会为所有JS文件启用产格模式也就是说它会在文件头部加上如下代码:
use strict在开发一个loader时我们可以借助 npm/yarn 的软链能进行本地调试(当然之后可以考发布到 npm等)。下面让我们初始化这个loader并配置到工程中。 创建一个 force-strict-loader 目录然后在该目录下执行 npm初始化命令
npm init -y接着创建 index.js也就是 loader 的主体
module.exports function(content){var useStrictPrefix \use strict\;\n\n;return useStrictPrefix content;
}现在我们可以在 Webpack 工程中安装并使用这个 loader了。
npm install path-to-loader/force-strict-loader在 Webpack工程目录下使用相对路径安装会在项目的node modules 中创建一个指向实际 force-strict-loader 目录的软链也就是说之后我们可以随时修改 loader源码并软链且不需要重复安装了。
下面修改 Webpack 配置
module:{rules:[{test:/\.js$/,use: force-strict-loader}]
}我们将这个loder设置为对所有JS 文件生效。此时对该工程进行打包应该可以看到JS文件的头部都已经加上了启用严格模式的语句。
启用缓存 当文件输入和其依赖没有发生变化时应该让 loader 直接使用存而不 行转换的工作。在 Webpack 中可以使用 his.cacheable 进行控制修改我们的
module.exports function(content){if(this.cacheable){this.cacheable();}var useStrictPrefix \use strict\;\n\n;return useStrictPrefix content;
}通过启用缓存可以加快 Webpack 打包速度并且可保证相同的输人产生输出。
获取options 前文讲过loader的配置项通过 use.options 传进来如:
rules:[{test:/\.js$/,use: {loader:force-strict-loader,options:{sourceMap: true}}}]上面配置了一个配置项sourceMap接下来要再loader中获取要先安装一个依库loader-utils安装命令如下
npm install loader-utilsloader更新如下
var loaderUtils require(loader-utils);
module.exports function(content){if(this.cacheable){this.cacheable();}var options loaderUtils.getOptions(this) || {};var useStrictPrefix \use strict\;\n\n;return useStrictPrefix content;
}通过loaderUtils.getOptions可以获取到配置对象
source-map source-map可以便于实际开发者在浏览器控制台查看源码。如果没有对source-map进行处理最终也就无法生成正确的 map 文件在浏览器的 dev tool中可能就会看到错乱的源码。 下面是支持了source-map特性后的版本
var loaderUtils require(loader-utils);
var SourceNode require(source-map).SourceNode;
var SourceMapConsumer reuqire(source-map).SourceMapConsumer;
module.exports function(content){if(this.cacheable){this.cacheable();}var useStrictPrefix \use strict\;\n\n;return useStrictPrefix content;var options loaderUtils.getOptions(this) || {};if (options.sourceMap sourceMap) (var currentRequest loaderutils.getCurrentRequest(this);var node SourceNode.fromStringWithsourceMap(content,new SourceMapConsumer(sourceMap));node.prepend(usestrictPrefix);var result node.toStringWithSourceMap(( file: currentRequest ));var callback this.async();callback(nullresult.coderesult.map.toJSON());}//不支持source-map情况return useStrictPrefix content;
}我们通过source-map这个库来对map进行操作包括接收和消费之前的文件内容和source-map对内容节点进行修改最后产生新的source-map
在函数返回的时候要使用this.async获取 callback 函数(主要是为了一次性返回多个值)。callback函数的3个参数分别是抛出的错误、处理后的源码以及source-map