На самом деле поддержка нативных модулей браузера отсутствует уже год или два (впервые я узнал об этом во второй половине 2016 года).
можно выброситьwebpack
Использовать напрямуюimport
синтаксис как
Но поскольку это относительно новая вещь, сейчас я могу играть только с самим собой :p
Но это не повод не узнавать об этом, а переживать.
Во-первых, когда основные браузеры начали поддерживатьmodule
из:
- Safari 10.1
- Chrome 61
- Firefox 54 (может потребоваться
about:config
настройка страницы включенаdom.moduleScripts.enabled
) - Edge 16
Как использовать
Прежде всего, в использовании, единственная разница в том, что вам нужно использоватьscript
добавить тегtype="module"
атрибут, чтобы указать, что этот файл используется какmodule
способ работы.
<script type="module">
import message from './message.js'
console.log(message) // hello world
</script>
Затем в соответствующемmodule
файл часто находится вwebpack
как используется в.
Синтаксически разницы нет(первоначальноwebpack
То есть, чтобы познакомить вас с новым синтаксисом :))
message.js
export default 'hello world'
изящная деградация
Вот похожийnoscript
наличие этикеток.
допустимыйscript
добавить на ярлыкnomodule
Атрибуты для реализации схемы отката.
<script type="module">
import module from './module.js'
</script>
<script nomodule>
alert('your browsers can not supports es modules! please upgrade it.')
</script>
nomodule
Решение выглядит следующим образом: служба поддержкиtype="module"
Браузеры игнорируют включениеnomodule
атрибутscript
Выполнение скрипта.
не поддерживаетсяtype="module"
браузеры будут игнорироватьtype="module"
исполнение скрипта.
Это связано с тем, что браузеры по умолчанию анализируют толькоtype="text/javascript"
скрипт, а если не заполненtype
свойство по умолчанию равноtext/javascript
.
То есть браузер не поддерживаетmodule
на случай, если,nomodule
Соответствующий файл скрипта будет выполнен.
Некоторые детали, на которые следует обратить внимание
Но ведь он нативно предоставляется браузером, а способ использования тот же, что иwebpack
Определенно будут какие-то отличия в версии.
(по крайней мере один анализируется во время выполнения и один компилируется локально)
Правильное определение пути к модулю
Поскольку он реализован на стороне браузера, он не будет такимnode
, Существует глобальныйmodule
Один сказал (глобальные объекты находятся вwindow
внутри).
так,from 'XXX'
Определение этого пути будет немного отличаться от того, с чем вы были знакомы ранее.
// 被支持的几种路径写法
import module from 'http://XXX/module.js'
import module from '/XXX/module.js'
import module from './XXX/module.js'
import module from '../XXX/module.js'
// 不被支持的写法
import module from 'XXX'
import module from 'XXX/module.js'
существуетwebpack
В упакованном файле на глобальный пакет ссылаются черезimport module from 'XXX'
быть реализованным.
На самом деле это сокращение,webpack
пойдет по этому путиnode_modules
найти соответствующийmodule
и внесите.
но изначально поддерживаетсяmodule
не существуетnode_modules
Один сказал.
Итак, используя роднойmodule
Когда нужно вспомнить,from
Конечный путь должен быть допустимымURL
, и суффикс файла не должен быть опущен (Да, доступны даже удаленные файлы, в отличие отwebpack
Нужно упаковать локальные файлы вместе).
файл модуля по умолчанию откладывает
Этоscript
Еще одно свойство , которое идентифицирует файл как файл, не блокирующий отрисовку страницы, и будет выполняться в порядке документа после загрузки страницы.
<script type="module" src="./defer/module.js"></script>
<script src="./defer/simple.js"></script>
<script defer src="./defer/defer.js"></script>
Чтобы проверить изложенную выше точку зрения, на странице представлены следующие триJS
файл, все три файла выведут строку, вConsole
Порядок, видимый на панели, таков:
Встроенные скрипты также добавляют функцию отсрочки по умолчанию.
Потому что в обычном сценарииdefer
Ключевое слово относится только к файлу сценария, если онinline-script
, добавление атрибута не вступает в силу.
Но когдаtype="module"
, будь то файл или встроенный скрипт, он будет иметьdefer
характеристики.
Вы можете добавить асинхронный атрибут в скрипты типа модуля.
async
Это может действовать на всеmodule
тип сценария, либо встроенный, либо в виде файла.
но добавилasync
Ключевое слово Later не означает, что браузер будет выполняться при анализе файла сценария, а будет ждать, пока будут выполнены все сценарии, от которых зависит сценарий.module
Выполнить после загрузки.
Соглашение об импорте должно быть объявлено в начале фрагмента кода и не может быть выполнено внутри функции.
То есть дноlog
Порядок вывода полностью зависит отmodule.js
Продолжительность загрузки.
<script async type="module" >
import * from './module.js'
console.log('module')
</script>
<script async src="./defer/async.js"></script>
Модуль будет загружен только один раз
этоmodule
Единственное определение состоит в том, согласован ли полный путь, соответствующий ресурсу.
Если текущий путь к страницеhttps://www.baidu.com/a/b/c.html
, то файл в/module.js
,../../module.js
а такжеhttps://www.baidu.com/module.js
считаются одинаковымиmodule
.
Но как в этом примереmodule1.js
а такжеmodule1.js?a=1
определены как дваmodule
, поэтому результатом выполнения этого кода является то, что он будет загружен дваждыmodule1.js
.
<script type="module" src="https://blog.jiasm.org/module-usage/example/modules/module1.js"></script>
<script type="module" src="/examples/modules/module1.js"></script>
<script type="module" src="./modules/module1.js"></script>
<script type="module" src="./modules/module1.js?a=1"></script>
<script type="module">
import * as module1 from './modules/module1.js'
</script>
Несколько советов по использованию импорта и экспорта
Является ли это версией, изначально предоставленной браузером, илиwebpack
упакованная версия.
import
а такжеexport
По сути, это все еще распространено, и в грамматике нет разницы в грамматике.
Ниже перечислены некоторые из них, которые могут помочь вам лучше использоватьmodules
некоторые трюки.
переименование экспорта
При экспорте некоторых модулей это также можно сделать так:import
использовать, когдаas
ключевое слово, чтобы переименовать значение, которое вы хотите экспортировать.
// info.js
let name = 'Niko'
let age = 18
export {
name as firstName,
age
}
// import
import {firstName, age} from './info.js'
Советы: экспортные вызовы в отличие от Module.exports = {} в Node.exports = {}
Можно сделать несколько вызовов без перезаписи (за исключением повторяющихся имен ключей).
export { name as firstName }
export { age }
Таким образом, оба ключа будут экспортированы.
Все атрибуты, экспортируемые при экспорте, доступны для чтения.
то естьexport
Экспортированные свойства нельзя изменить, и вы получите исключение, если попытаетесь это сделать.
Однако что-то вродеconst
Эффект, если экспортируемое значение является ссылочным типом, таким как объект или массив.
Вы можете манипулировать некоторыми свойствами объекта, например, делатьpush
такие операции.
export {
firstName: 'Niko',
packs: [1, 2]
}
import * as results from './export-editable.js'
results.firstName = 'Bellic' // error
results.packs.push(3) // success
Такая модификация повлияет на другие ссылки на модуль, поскольку используется адрес.
Порядок экспорта в коде не влияет на конечный результат экспорта
export const name = 'Niko'
export let age = 18
age = 20
const или let не имеет значения для вызывающего
import {name, age} from './module'
console.log(name, age) // Niko 20
импортировать, чтобы получить несколько поз стандартного модуля
Получатьdefault
Достичь можно несколькими способами:
import defaultItem from './import/module.js'
import { default as defaultItem2 } from './import/module.js'
import _, { default as defaultItem3 } from './import/module.js'
console.log(defaultItem === defaultItem2) // true
console.log(defaultItem === defaultItem3) // true
Правило по умолчанию состоит в том, что первоеdefault
Соответствующий псевдоним, но если первый аргумент является деструктурированием, он будет разрешен для совпадения для всех экспортов.
P.S. Параметров одновременно два, указывающих, что первый дефолтный, а второй все модули
Синтаксис экспорта всего следующий:
import * as allThings from './iport/module.js'
Запись файла экспорта, аналогичного индексу
Если вы столкнетесь с такой потребностью, в некоторых местах будет использоваться десятьmodule
, если каждый разimport
Десять, это определенно пустая трата времени, и это также вызовет у людей неприятные ощущения визуально.
Итак, вы можете написать что-то вродеindex.js
файл, в этом файле он вводится в блок, а затем при использованииimport index
Вот и все.
В общем можно написать так:
import module1 from './module1.js'
import module2 from './module2.js'
export default {
module1,
module2
}
положить всеmodule
импортировать и экспортировать какObject
, что действительно очень удобно в использовании.
Но этот индексный файл все еще уродлив, поэтому вы можете использовать следующий синтаксис для достижения аналогичной функции:
export {default as module1} from './module1.js'
export {default as module2} from './module2.js'
Затем измените его на следующий формат при вызове:
import * as modules from './index.js'
Примечания
Напоминает мне о недавнем бумеdeno
, так же упоминается одна из фич, нетnode_modules
, зависимые сторонние библиотеки получаются напрямую через сетевые запросы.
Затем изначально предоставляется в браузереmodule
Это также аналогичная реализация, но все движется в более гибком направлении.
желание отказатьсяwebpack
Приходите развивать день скорее :)
использованная литература
Репозиторий GitHub для примера кода в статье:массив телепортации