It works after I put an x-data directive to a parent element. (I also put the defer to the app.js)
<div x-data="{ date: '' }">
<input x-mask="99/99/9999" placeholder="MM/DD/YYYY" x-model="date">
</div>
<script src="{{ asset('js/app.js') }}" defer></script>
It doesn't mention on the alpineJS x-mask plugin page.
And I finally understand what the document said about the x-data in the Start Here and x-data.
Everything in Alpine starts with the x-data directive.
Everything in Alpine starts with an x-data directive. Inside of x-data, in plain JavaScript, you declare an object of data that Alpine will track.
Thanks to people replied me on the stackoverflow