多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Loader 用于对模块的源代码进行转换。loader 可以使你在 require() 或"加载"模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript,或将内联图像转换为 data URL。loader 甚至允许你在 JavaScript 中 require() CSS文件! **简单来说,Loader可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为参数,返回转换的结果。** ## Loader 特性 * loader 支持链式传递。能够对资源使用流水线(pipeline)。loader 链式地按照先后顺序进行编译。loader 链中的第一个 loader 返回值给下一个 loader。在最后一个 loader,返回 webpack 所预期的 JavaScript。 * loader 可以是同步或异步函数。 * loader 运行在 Node.js 中,并且能够执行任何可能的操作。 * loader 接收查询参数。用于 loader 间传递配置。 * loader 也能够使用 options 对象进行配置。 * 除了使用 package.json 常见的 main 属性,还可以将普通的 npm 模块导出为 loader,做法是在 package.json 里定义一个 loader 字段。 * 插件(plugin)可以为 loader 带来更多特性。 * loader 能够产生额外的任意文件。 loader 通过(loader)预处理函数,为 JavaScript 生态系统提供了更多有力功能。用户现在可以更加灵活的引入细粒度逻辑,例如压缩(compression)、打包(package)、语言翻译(language translation)和其他更多。 ## 使用babel-loader ### 1.新建文件目录 ![](https://box.kancloud.cn/5f3622ab4e846a643deb512aa2faa651_203x179.png) ### 2.配置webpack.config ~~~javascript var path = require('path'); //webpack2.0以后,路径需要引用这个模块 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-bundle.js' }, module:{ rules:[{ test: /\.js$/, //正则匹配所有js文件 exclude: /node_modules/, //排除node_modules文件夹下的js use:{ loader: 'babel-loader', //使用babel-loader处理找到的js文件 options: { ////采用babel-loader的"es2015"规则将找的js为浏览器可识别的js presets: ['es2015'], plugins: ['transform-remove-strict-mode'] } } }] }, plugins: [ new htmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: 'body', title: 'This is my plugin title.' }) ] } ~~~ **模板index.html** ~~~html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> <%= htmlWebpackPlugin.options.title %> </title> </head> <body> </body> </html> ~~~ **app.js** ~~~ const App = () => { console.log('app测试'); } ~~~ ### 3.安装loader和plugin 在生成之前我们要先用npm安装我们需要的loader和plugin,安装方式查阅[Babel官方](http://babeljs.io/docs/setup/#installation) ~~~ npm install --save-dev babel-loader babel-core npm install --save-dev babel-cli babel-preset-es2015 npm install --save-dev babel-plugin-transform-remove-strict-mode ~~~ ### 4.成功生成的main-bundle.js 和 index.html ~~~javascript /* 0 */ /***/ (function(module, exports) { var App = function App() { console.log('app测试'); }; /***/ }) /******/ ]); ~~~ ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> This is my plugin title. </title> </head> <body> <script type="text/javascript" src="js/main-bundle.js"></script></body> </html> ~~~ ## 通过packge.json配置 ### 1.npm初始化文件目录 ~~~ npm init ~~~ 一路enter下去之后,发现多处了一个package.json文件。 ### 2.配置package.json 在这个文件中我们可以看到之前安装过的如babel-loader、webpack等工具,参考[Babel官方](http://babeljs.io/docs/setup/#installation)添加“babel”一项配置即可。 ~~~javascript { "name": "webpackdemo6", "version": "1.0.0", "description": "", "main": "webpack.config.js", "babel":{ "presets": ["es2015"], "plugins": ["transform-remove-strict-mode"] }, "dependencies": { "babel-cli": "^6.24.1", "babel-core": "^6.25.0", "babel-loader": "^7.1.1", "babel-plugin-transform-remove-strict-mode": "^0.0.2", "babel-preset-es2015": "^6.24.1", "html-webpack-plugin": "^2.29.0", "webpack": "^3.3.0" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } ~~~ 成功生成后可以看到结果与我们用webpack的loader生成的是一样的。 ## 通过.babelrc配置 ### 1.新建.babelrc文件 ~~~javascript { "presets":[ "es2015" ], "plugins":[ "transform-remove-strict-mode" ] } ~~~ ### 2.修改webpack.config(去掉use下的presets和plugins即可) ~~~javascript var path = require('path'); //webpack2.0以后,路径需要引用这个模块 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-bundle.js' }, module:{ rules:[{ test: /\.js$/, //正则匹配所有js文件 exclude: /node_modules/, //排除node_modules文件夹下的js use:{ loader: 'babel-loader', //使用babel-loader处理找到的js文件 } }] }, plugins: [ new htmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: 'body', title: 'This is my plugin title.' }) ] } ~~~ 以上三种打包生成的结果是一样的,而且bundle.js的内容也没有“use strict”,证明plugin都生效了。 ## 优化速度 如果文件项目比较大,我们发现了运行完打包命令后,很长时间才能看到打包的结果,那是因为我们没有给babel-loaders指定待打包的文件路径,导致它需要在整个目录下一个一个寻找,下面我们来优化下打包的时间,修改webpack的打包配置文件webpack.config.js,内容如下: ~~~javascript var path = require('path'); //webpack2.0以后,路径需要引用这个模块 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/app.js', output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-bundle.js' }, module:{ rules:[{ test: /\.js$/, //正则匹配所有js文件 include: path.resolve(__dirname,'src'), //指定babel-loaders寻找的文件路径,注意需是绝对路径 exclude: path.resolve (__dirname, 'node_modules'), //排除node_modules文件下js,注意需是绝对路径 use:{ loader: 'babel-loader', //使用babel-loader处理找到的js文件 } }] }, plugins: [ new htmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: 'body', title: 'This is my plugin title.' }) ] } ~~~