laravel mix 笔记

github地址:
	https://github.com/JeffreyWay/laravel-mix

官网:
	https://laravel-mix.com/

中文文档:
	https://segmentfault.com/a/1190000015049847

对于 laravel-mix,我们只需要知道,它是位于 webpack 顶层的一个配置层,使用它会让我们的操作变得非常简单,大约 80% 的场景下都可以满足我们。

在项目中,我们基本只需要关注:
	package.json
	webpack.mix.js
	webpack.config.js 		// 默认是在 'node_modules/laravel-mix/setup/webpack.config.js',为了我们不修改包源码,我们可以复制一份放到根目录,然后重新指定 webpack 的配置为该文件

大部分,我们的操作都是修改:webpack.mix.js

使用方式:
	let mix = require('laravel-mix');

	mix.js('src/app.js', 'dist')
	   .sass('src/app.scss', 'dist')
	   .setPublicPath('dist');			// 设置 'mix-manifest.json' 文件的生成路径

API
	1.Javascript
		1>单文件 -> 单文件
			mix.js('src/app.js', 'dist/app.js');	

		2>多文件 -> 单文件
			mix.js(['src/app.js', 'src/extra.js'], 'dist/app.js');	

		3>多文件 -> 多文件(链式调用)
			mix.js('src/app.js', 'dist/app.js')
			   .js('src/extra.js', 'dist/extra.js');

		4>mix.js() 默认支持 vue,对于 react,我们需要使用:
			mix.react() 替代,方法同 mix.js() 应该一致

	2.Library Code Splitting(库代码分离)
		这个是项目的优化,对于很多加载的第三方包,我们轻易不会修改,顶多是版本升级,对于这部分代码,可能还非常大,不需要因为我们业务代码的修改,而重新编译一次,可以持久的缓存下来。

		mix.extract(['vue', 'jquery']);

		使用了 extract() 方法,会生成3个文件:
			app.js
			vendor.js
			manifest.js

		我们在项目中,都需要引入:
			<script src="/js/manifest.js"></script>
			<script src="/js/vendor.js"></script>
			<script src="/js/app.js"></script>	

	3.BrowserSync(浏览器自动刷新)
		BrowserSync 浏览器同步测试工具,一旦检测到更改,会自动刷新页面。可以同时更新 PC、平板、手机等设备的页面,非常便于我们的开发。

		mix.browserSync('域名');
		mix.browserSync({
			proxy: '域名',
		});

	4.Hot Module Replacement(HMR - 热模块替换 - 热加载)
		也是一项非常好的技术,只会更新新修改的地方,并不会改变未修改的地方的状态。

		package.json 中的 scripts 模块里的 hot:
			hot: "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js"

		当我们项目使用的是 https,hot 中添加 --https 选项
			hot: "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --https --config=node_modules/laravel-mix/setup/webpack.config.js"

		使用 HMR,需要明白的一点是,它会在内存中来生成一个打包的 bundle.js 文件,而不是我们之前的打包文件 app.js。而且提供了我们访问该文件的 url。
			http://localhost:8080/js/bundle.js

		我们在开发环境,手动更新 url 是一个负担,而 laralel 提供的 mix() 方法,已经帮我们处理好了:
			mix('js/bundle.js')

	5.Versioning(版本化)
		mix.version();		// 会自动给编译后的文件,添加版本号

		mix.version(['js/extra.js']);		// 还可给其他文件,添加版本号

		重新生成一个版本号,在整个项目中,修改静态文件的版本号,也是一个非常麻烦的问题,laravel 的 mix() 也默认已经支持了

	6.CSS Preprocessors(CSS 预处理器)
		mix.sass('src', 'output', pluginOptions);
		mix.less('src', 'output', pluginOptions);
		mix.stylus('src', 'output', pluginOptions);
		mix.postCss('src', 'output', [ require('precss')() ])
		mix.standaloneSass('src', 'output', pluginOptions); // Isolated from Webpack build.

		1>对于 sass 编译,可以使用 .sass 和 .scss 语法
		2>对于 css 文件中的 url(),默认情况下,会将 '相对 URL' 复制到 'public/images/',然后重写 url() 路径,会添加上 '版本号'。
		3>独立 Sass 构建(standaloneSass()),看文档

	7.Copying Files(复制文件)
		mix.copy()

		mix.copy(from, to);								// 文件复制
		mix.copy('from/regex/**/*.txt', to);			// 正则复制
		mix.copy([path1, path2], to);					// 多个文件复制
		mix.copyDirectory(fromDir, toDir);				// 目录复制

	8.OS Notifications(系统通知)
		默认每次编译,都会显示系统通知,通知会显示一些错误提示。某些情况下,可能不想显示通知,例如:生产环境。

		mix.disableNotifications(); 		// 禁用系统通知

	9.Concatenation and Minification(打包和压缩)
		如果使用得到,Laravel Mix 和 webpack 会帮我们处理好所有必要模块的打包和压缩。当我们要处理一些其他代码或第三方类库,可能也需要使用打包和压缩的功能,都给我们提供好了

		// 合并文件
		mix.combine(['one.js', 'two.js'], 'merged.js');		// 生产环境下(export NODE_ENV=production),combine() 命令还会额外帮我们压缩

		// 使用 Bable 编译来合并文件	
		mix.babel(['one.js', 'two.js'], 'merged.js');		// 同 combine() 基本一致,还会调用 Babel 编译,将所有 ES2015 代码转换成原生 javascript,以便所有浏览器都可以识别。

		// 压缩文件
		mix.minify('js/file.js');
		mix.minify(['js/one.js', 'js/two.js']);

		注意:
			压缩文件,并不会覆盖原文件,会生成一个 '.min.js' 文件 
			只有生产环境才会压缩(export NODE_ENV=production)
			不同同时使用 combine(xxx).minify(xxx),只需要使用单一个 combine(),因为它在生产环境下会自动压缩文件

	10.Autoloading(自动加载)
		Webpack 提供了一个功能,将一个模块作为一个变量,然后再其他任意模块中使用。

		mix.autoload({
			jquery: ['$', 'Window.jQuery'],
		});

		会将 jquery 模块,作为 $ 或 Window.jquery。所谓的自动加载,就是在凡是使用到 $ 或 window.jQuery 的文件里,webpack 都会在文件头部,给我们追加一个:
			var $ = require('jquery');
			Window.jQuery = require('jquery');

	11.Event Hooks(事件钩子)
		mix.then(function () {});

		每次编译完成后,可能想要处理一些逻辑,可以使用。传递一个回调方法,方法中,会注入一个 'stats' 对象。

		mix.then((stats) => {
			console.log(Object.keys(stats.compilation.assets));
		});

		// stats 参考
		https://github.com/webpack/docs/wiki/node.js-api#stats

	12.Quick Webpack Configuration(快速配置 Webpack)
		mix.webpackConfig({} || cb);

		我们可以通过编辑 webpack.config.js 来配置 webpack,还可以通过 mix.webpackConfig() 来简单配置 webpack,这个适用于简单配置。此外由于 Laravel 默认没有 webpack.config.js 文件,这种方式,更方便我们配置

		为 Laravel Spark 添加一个自定义模块路径:
			mix.webpackConfig({
			    resolve: {
			        modules: [
			            'node_modules',
			            path.resolve(__dirname, 'vendor/laravel/spark/resources/assets/js')
			        ]
			    }
			});
		当传递一个回调函数,可以访问 wepack 和它的所有属性
			mix.webpackConfig(webpack => {
			    return {
			        plugins: [
			            new webpack.ProvidePlugin({
			                $: 'jquery',
			                jQuery: 'jquery', 
			                'window.jQuery': 'jquery',
			            })
			        ]
			    };
			});

	13.Extending Mix(扩展 Laravel-Mix)
		比较复杂,看文档,用的也少


CUSTOM RECIPES(自定义方法)
	1.LiveReload
		Laravel Mix 默认支持了 BrowserSync,你可能更喜欢使用 LiveReload。

		LiveReload 也是一个检测文件改变,然后重载页面的程序。(和 BrowserSync 的区别,不清楚)

		1>安装 
			npm install webpack-livereload-plugin@1 --save-dev
		2>配置 webpack.mix.js
			var LiveReloadPlugin = require('webpack-livereload-plugin');

			mix.webpackConfig({
			    plugins: [
			        new LiveReloadPlugin()
			    ]
			});
		3>安装 LiveReload.js
			1)可以通过安装 LiveReload Chrome 插件
			2)也可以在</body>前,添加:
				@if(config('app.env') == 'local')
				    <script src="http://localhost:35729/livereload.js"></script>
				@endif
		4>运行开发服务器
			npm run watch

	2.jQuery UI
		jQuery UI 是一个用于渲染常用组件的工具包,例如:datepickers、draggables等。无需任何调整,就可以与 Laravel Mix 一起使用。

		1>构建 webpack.mix.js 配置
			mix.js('resources/js/app.js', 'public/js')
			   .sass('resources/sass/app.scss', 'public/css');
		2>安装
			npm install jquery-ui --save-dev
		3>加载你想用的组件
			// resources/js/app.js
			import $ from 'jquery';
			window.$ = window.jQuery = $;
			import 'jquery-ui/ui/widgets/datepicker.js';
		4>加载 CSS
			// resources/css/app.css
			@import '~jquery-ui/themes/base/all.css';
		5>触发 UI 插件
			// resources/js/app.js
			$('#datepicker').datepicker();

ADVANCED CONFIGURATION(高级配置)
	mix.options({
	    extractVueStyles: false,
	    processCssUrls: true,
	    uglify: {},
	    purifyCss: false,
	    //purifyCss: {},
	    postCss: [require('autoprefixer')],
	    clearConsole: false
	});

	extractVueStyles - 提取 .vue 组件样式(CSS在<style>标签内)到一个专用文件,而不是将其嵌入到HTML中。 

	globalVueStyles - 表示一个文件包含在每个组件样式中。这个文件应该只包含变量、函数或mixin,以便在最终的编译文件中防止重复的css。这个选项只有在启用了提取工具时才有效。

	processCssUrls - 进程/优化相对样式表url()。默认情况下,Webpack会自动更新这些url。但是,如果您的文件夹结构已经按照您想要的方式进行组织,那么将此选项设置为false以禁用处理。

	uglify - 使用这个选项来合并你的项目需要的任何定制的uglify选项。

	purifyCss - 如果你想要混合自动读取你的HTML/Blade文件,并删除你的CSS包,你可以将这个选项设置为true。您还可以传递包含purifycss-webpack选项的对象。

	postCss - 合并任何自定义的postCss插件。

	clearConsole - 设置为false,如果您不想在每次构建后清除终端/控制台。

补充:
	laravel 的 '通过 Laravel Mix 编译前端资源' 文档,也提供了几个官方没有提及的地方,这里也记录下
		https://laravelacademy.org/post/9553.html#toc_17

	1.Source Map
		默认被禁用,可以用过下面的方式开启:
			mix.sourceMaps();

		Source Map 会带来编译/性能的开销,但是浏览器的 firebug 调试时,可以将压缩、混淆后的代码,还原回去,方便我们调试。(应该是这个作用,自己查找资料)

	2.原生 CSS
		将多个原生 CSS 文件合并到一个文件中,使用 styles()
			mix.styles(['one.css', 'two.css', 'three.css'], 'all.css');

	3.Vanilla JS
		同 mix.styles() 类似,将多个 javascript 文件合并到一个文件中,使用 scripts()
			mix.scripts(['one.js', 'two.js', 'three.js'], 'all.js');

		同样,和 mix.babel() 类似,mix.babel() 的不同是:会将合并后的文件,经过 Babel 编译,从而将所有 ES2015 代码转换为所有浏览器都支持的原生 javascript。

	4.使用 extract() 进行库代码分离时,3个文件的引入顺序,不可改变!!!这个非常关键!!!官方文档竟然没说!!!
		<script src="/js/manifest.js"></script>
		<script src="/js/vendor.js"></script>
		<script src="/js/app.js"></script>

	5.环境变量
		可以在 laravel 的 .env 文件,定义 'MIX_' 前缀的环境变量,然后注入到 Mix:
			MIX_SENTRY_DSN_PUBLIC=http://example.com
		通过 'process.env' 对象来访问:
			process.env.MIX_SENTRY_DSN_PUBLIC


猜你喜欢

转载自blog.csdn.net/beyond__devil/article/details/83791179